跟踪分析Linux内核的启动过程
朱明涛 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
实验指导
使用实验楼的虚拟机打开shell
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
内核启动完成后进入menu程序(《软件工程C编码实践篇》的课程项目),支持三个命令help、version和quit
使用gdb跟踪调试内核
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选项
另开一个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跟踪调试内核从start_kernel到init进程启动
详细分析从start_kernel到init进程启动的过程
实验过程:
1.登录实验楼linux内核分析实验,打开实验环境
打开shell
执行命令:cd LinuxKernel/
执行命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
启动MenuOS。包含三个命令:help,version,quit。
2.使用gdb跟踪调试内核
执行命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
重新打开一个shell,使用gdb命令进行调试
1.file linux-3.18.6/vmlinux
2.target remote:1234
3.break start_kernel
使用c命令继续运行,使用list命令查看上下文,如此往复,可以最终理解内核启动过程
总结
start_kernel() 中调用了一系列初始化函数,以完成kernel本身的设置。
Linux内核的启动,就是start_kernel()来进行各种初始化工作,最终执行到rest_init()来初始化0号进程和1号用户态的进程。然后操作系统就运行起来了。
百家号 互联网微风说
微信公众号 weisico-com
转载请注明:微思考学习网-关注技术,分享知识 >> 使用gdb跟踪Linux内核启动过程的分析