跟踪分析Linux内核的启动过程

余星光 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


1、实验目的:

        跟踪分析一个简单的Linux内核启动过程,理解操作系统是怎么启动的。


2、预备知识:

gdb调试常用参数
r(run)   开始运行程序;
c(continue)    继续运行一直到断点停止
b(break)   设置程序断点
p(print)   打印变量值
s(step)   单步跟踪,进入函数内部
n(next)   单步跟踪,不进入函数
finish   跳出函数调试,并打印返回时的信息
u(until)   跳出循环体
q(quit)   退出gdb
l(list)   显示当前行后面的源程序
bt(backtrace)    查看堆栈信息
info   查看各类gdb信息以及环境信息
clear   清除全部已定义的断点
delete    删除指定的断点


3、实验过程

3.1 使用实验楼虚拟机打开shell,执行如下命令:

cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

运行效果如下:


输入help命令,可以看到系统支持三个简单命令:help、version、quit


3.2 使用gdb跟踪调试

1) 另开一个shell窗口,进入LinuxKernel目录,输入如下命令

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s –S
效果如下


# 关于-s和-S选项的说明:

# -S freeze CPU at startup (use ’c’ tostart execution) 在系统启动的时候冻结CPU,使用c键继续执行后续操作

# -s shorthand for -gdb tcp::1234 打开远程调试端口,若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项


2) 打开另外一个shell终端,执行以下命令

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之前,也可以在之后
(gdb)c

运行截图如下:


        系统执行到start_kernel()函数,输入list命令可以查看之后的代码;利用break设置断点,c继续执行,list查看函数代码可以方便调试Linux启动过程中用到的任何函数。



4、分析start_kernel()函数

        start_kernel()类似C程序中的main函数。在start_kernel()函数之前,内核的代码都是用汇编写的,主要工作是完成一些最基本的初始化与环境设置工作;在start_kernel()中Linux将完成整个系统的内核初始化,在start_kernel的最后,是调用rest_init函数,在rest_init函数中,内核将产生第一个真正的进程,即pid=1的1号进程,而在start_kernel函数中init_task是静态制造出来的,pid=0,我们可以在start_kernel函数的开始处,看到其被初始化的代码,它试图将从最早的汇编代码一直到start_kernel的执行都纳入到init_task进程上下文中,在其初始化工作完成后,就会成为系统的idle进程。事实上在更早前的sched_init函数中,通过init_idle(current, smp_processor_id())函数的调用就已经把init_task初始化成了一个idle task,init_idle函数的第一个参数current就是&init_task,在init_idle中将会把init_task加入到cpu的运行队列中,这样当运行队列中没有别的就绪进程时,init_task(也就是idle task)将会被调用,它的核心是一个while(1)循环,在循环中它将会调用schedule函数以便在运行队列中有新进程加入时切换到该新进程上。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核设计与实现是一本深入介绍Linux操作系统内核结构和实现原理的经典著作。该书由李梁在1999年出版,目前已经成为学习Linux内核的权威参考书籍。 《Linux内核设计与实现》先介绍了Linux操作系统的基本架构和组成部分,包括进程调度、内存管理、文件系统、设备驱动等重要内容。接着讲述了Linux内核启动过程,从加载引导程序开始,到初始化各个子系统和驱动,最终进入用户空间。作者逐层剖析了Linux内核的实现原理和数据结构,使读者能够深入理解Linux内核运行的机制。 阅读本书有助于了解Linux内核设计的哲学和设计原则,包括模块化、可移植性、可扩展性等。通过学习本书,读者可以获得一种全面而深入的了解操作系统内核的能力,为今后编写和调试内核代码提供有力的支持。 此外,《Linux内核设计与实现》还介绍了一些内核开发的工具和调试技巧,如kdb调试工具、系统跟踪技术等。这些内容对于进行内核开发和调试的读者尤为重要。 最后,本书还对Linux内核的未来发展进行了展望,介绍了一些新的技术和方向,如虚拟化、容器等。这些内容能够帮助读者跟踪内核技术的最新发展和趋势。 总而言之,《Linux内核设计与实现》是一本全面深入的Linux内核学习资料,既适合想要了解Linux内核原理的初学者,也适合有一定经验的开发者。它可以帮助读者理解Linux操作系统的内部工作原理,提高操作系统开发和调试的技能,对于专注于Linux开发的人来说是一本必备的参考书。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值