跟踪分析一个简单的linux内核的运行

1、首先打开linux内核的目录

cd LinuxKernel/

2、然后对内核进程进行挂载

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
# -S freeze CPU at startup (use ’c’ to start execution)
# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

这里写图片描述

3、内核进程已经挂载了,这个时候我们需要使用gdb来对程序进行调试跟踪。
我们使用的的是如下命令

gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

其中target remote:1234要和上面的命令保持一致,如果上面的qemu命令用了自己定义的
端口,则这里也要设置为相应的端口。
需要注意的是,这里需要重新打开一个shell终端进行gdb调试
这里写图片描述这里写图片描述
然后在需要加断点的地方使用break命令。
在设置断点之后可以使用c命令进行单步执行,并且使用list命令对断点前后的上下文进行查看。
这里写图片描述这里写图片描述

4、下面我们不用断点的方法进行演示,我们直接对init文件进行分析,是分析过程更加好看。
首先我们打开linux内核代码:http://codelab.shiyanlou.com/xref/linux-3.18.6/,打开init文件夹中的main.c文件。
我们找到main.c中的start_kernel()函数。
这里写图片描述
start_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。
对于程序员来说,main()是程序的入口,而start_kernel()对于内核来说,就像是C代码中的main()。
在start _kernel()中,Linux将完成整个系统的内核初始化。而内核初始化的最后一步就是启动init进程——所有进程的祖先。
rest_kernel()是start_kernel()中内核初始化的尾声。这里的主要工作就是完成进程的init。
这里写图片描述
在rest_kernel()中,

kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);

这个函数的主要功能就是创建一个内核线程——实际上就是内核进程。Linux内核不支持类似windows NT一样的线程概念的。Linux本质上只支持进程。
而上面的init只是一个函数,并不是init process。当内核创建内核线程时,就会运行此函数,而在此函数的结尾就是启动init process。
值得一提的是,init process是Linux系统的第一个用户态进程,是由Linux内核直接启动的。

总结:
内核最初执行的start_kernel(),并且在start_kernel()中完成一系列的初始化操作。
idle就相当于0号进程,是进程的起点和终点,就是在start_kernel()中的set_task_stack_end_magic(&init_task);这个init_task就是这个0号进程。
这次主要是示范一下内核的初始化过程的大致过程,其中还有很多的细节没有一一进行讲述。但是却给大家提供了一个方法,那就是可以通过直接查看源代码,或者是通过gdb来对程序进行跟踪,从而更加深入的了解到程序的执行过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值