如果能给linux kernel打log,如果能单步运行,如果能像普通应用程序那样,step by step的查看程序跑哪里了.. 该多好?这是一个梦想,但从未实现过:因为那是kernel,不是应用程序。kernel一闪而过,我有什么能力让它驻足停留,为自己看个够?虽然,也知道kernel是人写的(废话),但那是全世界顶尖级黑客的产物---他们怎么把kernel写出来,然后怎么debug,无从知道...

  曾经有这样的猜想:这些人可能都是有两台机器在开发,一台机器编码,然后把新的kernel拿到另外一台上去运行,运行的过程产生log,最后cp出来,研究。这样想来,不经对他们更加敬佩..大神啊!终究就是大神!(真这样,这不但费时间,还费耐心-------岂是寻常人能干的?)

  由于自己是某小板子的关注者,也可以说是学习者。最近自己想玩玩此小板子,但是没有入手。思来想去,记得在开始查看该小板子资料的时候,这个小板子的官方debian系统是可以跑在一个叫qemu的虚拟机上的。又突然模糊记得,该资料对qemu的简介中,有一句“可以对kernel打断点”的言语。呀!若能够对kernel打断点,那岂不是可以利用它来debug kernel了吗?!

  于是网络千百度,一切就呈现在自己的面前: qemu + gdb + gdbserver 可以单步kernel ! 不但可以单步,而且寄存器什么的用命令完全可以查看!-----针对于kernel:运行到了哪里,都可以清清楚楚,明明白白!

  又是千百度!终于在自己的ubuntu-14.04上弄好了qemu,弄好了kernel,然后启动起来,看着那信息从qemu屏幕上闪过,心里高兴!

然后使用gdb去调试,又遇到小问题---也不算小:准备放弃了!歇息了几个小时,中间看了某宝的一部电影,某人因武而痴,于是寻找天下高手,“一决高下,也决生死”。我若此,岂不是会放弃自己的生命?!不就是一个kernel调试方法吗?继续搞。

  当然,这个问题不是我第一个遇到,所以,别人已经解决,并把解决的方法发在网上了---只是麻烦了些许。

  最终完美收局:在gdb里面单步单步的运行kernel程序,然后看看代码走向如何,以及跑到了什么地方~  体现了一把,千言万语一句话:不错!很高兴!

  当然,此处由于心情高兴,就胡言乱语一篇,为自己的心情留个log 。而真正的方法,将在明天重新整理成一篇博客,共享到网络,以回报网络分享。

  

ps:  

  最近有两件事让我这个山里娃高兴:其一,公司某白妞,cannot speak Chinese, only speaking english。某日某人,壮着胆子,Chat to her in English in a few minuters, so surprise in my mind !  其二:今日,kernel从此不再一飘而过,也可以为我稍作停留!也许,我可以试着关注下kernel maillist 上面的一些little bug : Yes, my email is to show on the kernel mailList ! happy ! happy ! happy !(^_^).

单步运行linux kernel ?的更多相关文章

  1. ubuntu: qemu+gdb 调试linux kernel 学习笔记

    声明: 本笔记内容并非本人原创,90%来自网络资料的整合.同时,由于自己是刚刚接触qemu & gdbserver remote debug,本文也就算不得教程,仅供有缘人参考而已. ---- ...

  2. Linux Kernel 2.6.28 以上有BUG,系统运行第208.5天down机

    简介: 业务服务器有一台服务器出现意外down机,服务器ping 不通.无法登陆,本想通过公司KVM系统登陆系统重启解决,登陆KVM后发现系统屏幕打印大量的内核错误,KVM无法使用.无法发送重启服务器 ...

  3. Linux Kernel - Debug Guide (Linux内核调试指南 )

    http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...

  4. Linux kernel make 常用选项介绍

    Linux kernel 编译方法大全记录 一.这是一个我自己写的自动make脚本: #!/bin/sh export ARCH=arm export CROSS_COMPILE=arm-linux- ...

  5. Linux Kernel 代码艺术——编译时断言

    本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel” 系列文章中),一来通过内核 ...

  6. Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State

    目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...

  7. arm linux kernel 从入口到start_kernel 的代码分析

    参考资料: <ARM体系结构与编程> <嵌入式Linux应用开发完全手册> Linux_Memory_Address_Mapping http://www.chinaunix. ...

  8. Linux Kernel Schduler History And Centos7.2's Kernel Resource Analysis

    本文分为概述.历史.el7.2代码架构图解三部分. 解决的问题: a.Kernel调度发展过程: b.以架构图的方式,详解el7.2具体调度实现.内核线程模型.调度时间片计算,以及探究整个Kernel ...

  9. arm linux kernel启动之start_kernel

    了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了.start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝 ...

随机推荐

  1. js match regex

    需要返回成数组元素的要放在括号里头 var arr = /input-([0-9]*)-([0-9]*)/.exec(id); var all = arr[0]; var row = arr[1]; ...

  2. bjfu1262 优先队列

    比较典型的应用优先队列的题.题目是在一个长为n的数组中,依次问m个数中的最小值.那么把值和下标做成一个结构体,放进优先队列里,每次移动窗口就把该T的T掉,剩下的最小值就是答案,复杂度nlogn,轻松a ...

  3. 为我所用之Monkey

    文章由来:有朋友问到Monkey的使用的问题,就整理一下Monkey的基本使用,以备后用查询. Monkey是一Android中的一个命令行工具,eclipse中有自带此工具,可以运行在模拟器以及真实 ...

  4. C#拼音转换,将简体中文转换成拼音

    1. 要进行拼音转换操作,首先要引入几个文件,也就是用于操作拼音转换的文件,就是微软提供给开发者的一个类库 Microsoft Visual Studio International Pack 1.0 ...

  5. cmd命令 chcp

    chcp是“change code page”的缩写.(关于代码页的相关知识详见:http://www.cnblogs.com/minisculestep/articles/4920992.html)

  6. Floyd算法解决最短路径问题

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的中午,A和B在吃过中饭之后,来到了一个新的鬼屋!鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些 ...

  7. bzoj1013

    这道题题解太多,只贴代码. #include<cstdio> #include<cmath> #include<algorithm> using namespace ...

  8. C#面向对象基础01

    面向对象不是取代面向过程的类.对象."人"是类,"张三"是人这个类的对象.类是抽象的,对象是具体的.按钮就是类,某个按钮就是对象.对象可以叫做类的实例.类就像i ...

  9. Chapter7:类

    关于this指针 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象.当我们调用一个成员函数时,用请求该函数的对象初始化this. total.isbn(); //等价于编译器重写为 Sa ...

  10. 捣蛋phpwind过滤器执行流程

    从上一篇我们就大概就知道过滤器的定义和怎样去配置,这一节来说说执行流程 public function run($handlerAdapter = null) { $handlerAdapter != ...