Linux中断实验报告结果分析,“Linux内核分析”实验三报告(示例代码)

构造一个简单的Linux系统

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

实验内容:

一、gdb跟踪调试内核从start_kernel到init进程启动

1.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) cpu初始化之前把它冻结起来

// -s shorthand for -gdb tcp::1234 在1234端口上建立了一个gdb server

若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

a6b8a5abd91648eda7d9e6064c101eab.jpg

2.启动Linux内核的三个参数:kernel、initrd、root所在分区目录

代码:

qemu -kernel (文件名) -initrd (rootfs.img)

1)qemu相当于打开一个虚拟机

2)kernel启动一个内核,位置由其后的文件名指定。如果在当前目录下,可以直接输入文件名,如果不是,则需要输入该内核的全路径。

3)initrd指令是挂了一个ramdisk虚拟硬盘,是内核的重要补充,rootfs.img就是这个虚拟硬盘,内有分区,然后启动的其实是其中的init文件,这个文件是由之前的menuOS编译而成,gcc -o命名为init。

3.使用gdb跟踪调试:

1)加载符号表、建立连接、设置断点:

c26d0b8214644ad3b94887fa7905f2eb.jpg

2)输入c让qemu上的linux继续运行:

6ec8bf22d7784f70b026ceec95335a9c.jpg

3)输入list查看设置断点处的代码:

20180110183807265744.png

二、总结

init中main.c中有一个start_kernel函数,在start_kernel函数的尾部调用了一个rest_init

1)0号进程

有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程需要执行时调度到0号进程。

2)0号进程创建了1号进程和其他

rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)

kernel_init中有run_init_process,

run_init_process创建了1号进程,默认路径下的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值