2021-2022-1 20212825《Linux内核原理与分析》第四周作业
一.在实验楼平台上构建Linux系统MenuOS:
1.使用实验楼的虚拟机打开 shell
2.输入命令
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
3.gdb跟踪调试Linux内核
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
4.打开另一个shell窗口
# 打开 GDB 调试器
$ gdb
# 在 GDB 中输入以下命令:
# 在gdb界面中targe remote之前加载符号表
(gdb)file linux-3.18.6/vmlinux
# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)target remote:1234
# 断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel
5.再在rest_init处为内核代码增加一个断点,执行效果如下
二.总结
1.start_kernel()相当于C语言中的main函数,它是一切的起点,在该函数被调用之前,内核代码主要是用汇编语言写的,用于完成该硬件系统的初始化工作,为c代码的运行设置环境
2.通过start_kernel()函数调用内部模块init_task()来创建init进程,之后调用cpu_idle()演变成了idle进程,执行一次调度后,init进程运行。1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用do_execve加载init程序,演变成init进程(用户态1号进程),init进程是内核启动的第一个用户态进程。