第四周作业
一、实验楼实验三
使用qemu运行内核,并用gdb跟踪调试内核从start_kernel到init进程启动
1.实验过程:启动实验楼Linux系统和一个简单的文件系统。
2.跟踪调试内核的启动过程
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
-S可以使内核暂时冻结
3.另外开一个窗口,用gdb跟踪调试内核,用1234这个端口与gdbserver进行连接,并且从start_kernel设置断点进行单步调试。
在rest_init处设置一个断点,单步执行完后内核启动
二、本周知识小结
1.-s和-S的区别:
-s:在1234端口上创建一个gdb-server
-S:CPU初始化之前冻结起来
2.可以用list来查看函数详情。
3.gdb调试中s和n的区别:
s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。
4.start_kernel函数:
main.c中没有main函数,start_kernel()相当于C语言中的main函数,是一切的起点,在此函数被调用之前内核代码主要是用汇编语言写的。
init_task变量相当于第一个进程的PCB
trap_init()实现中断向量的初始化
mm_init()实现内存管理的初始化
sched_init()实现调度模块的初始化
5.rest_init():
rest_init是0号进程,它创建了1号进程init和其他一些服务进程,它能够实现后续的初始化工作,正式执行内核线程和其他服务进程。