- 内容说明
本次的内容,是一次 MOOC 课程的作业。具体的,是使用gdb工具+Qemu启动Linux内核,对Linux kernel的启动进行了简单的跟踪。 - 作业声明
qianyizhou17 + 原创作品转载请注明出处 + 《Linux 内核分析》MOOC 课程 http://mooc.study.163.com/course/USTC-1000029000 - 实验准备
本次实验并没有使用MOOC课程上提供的实验楼的环境,而是自行搭建了64Bit Ubuntu虚拟机,版本12.04,使用了3.16.8内核。自行搭建还是碰到了不少的问题:
- 内核编译失败
在MAC的虚拟机中对下载的内核进行编译,结果失败。后来发现源码目录位于共享文件夹下,而MacOS下不允许存在仅大小写差异的文件,因此net/netfilter/xt_tcpmss.c和net/netfilter/xt_TCPMSS.c只保留了一个。 - 内核无法配置
调用make menuconfig时,发现缺少curses.h文件。
解决方法:sudo apt-get install libncurses5-dev libncursesw5-dev - rootfs编译出错
在menu-master中,make rootfs时提示出错,问题出在64bit下gcc对-m32的支持问题上。
解决方法:sudo apt-get install libc6-dev-i386 - qemu安装与使用
虚拟机直接运行,提示缺少kvm支持。
解决方法:虚拟机软件设置中,额外对虚拟机增加虚拟化支持。 - gdb无法追踪
按照老师的方法进行操作,结果发现b/break打的断点没起作用——内核启动直接正常运行。
解决方法:这可能是Ubuntu 12.04 gdb的bug,需要强制使用hb——hardbreak才能使得断点生效。
- 内核编译失败
- 实验操作
1 准备增加debug的内核并编译。
2 使用qemu启动内核+MenuOS_fs,并冻结,对外提供调试端口1234:
qemu-system-i386 -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs/rootfs.img -S -s
3 额外启动一个shell,并使用hb指令打函数断点
4 使用list观察断点附近代码
- 总结
1 内核启动时,最初的函数入口是start_kernel函数(init/main.c),对start_kernel函数体进行观察
2 init_task结构是由手工创建的PCB(上一次课程内容),是为0号进程;
3 在rest_init函数中,kernel_thread(kernel_init, …),完成了1号进程的创建,也是第一个用户态进程;
4 在rest_init函数中,kernel_htread(kthread,…),完成了2号进程的创建,也是第一个内核线程。
Linux kernel的启动跟踪
最新推荐文章于 2022-07-07 15:45:00 发布