参考资料:《庖丁解牛Linux操作系统分析》
https://gitee.com/mengning997/linuxkernel
一、简介
Linux操作系统分析是从用户的角度对Linux的环境及其使用进行简单的介绍,然后通过Linux操作系统源代码分析了解Linux操作系统与底层硬件、上层应用之间的结构关系、调用关系,熟悉Linux操作系统的配置、安装过程,深入分析Linux操作系统对底层硬件的封装方法。
在课程中对操作系统工作原理、系统调用底层机制、进程的描述创建、进程切换和在系统中的执行过程进行了介绍。同时在课程中也利用qemu和gdb对linux内核的启动流程进行调试,使我对linux系统的运行原理有了更加深入的理解。
二、实验-debug linux kernel
课程中有一个配套的实验:debug linux kernel,主要是利用Qemu和gdb来跟踪调试linux的启动过程,下面对这个实验进行简要的介绍。
2.1 环境配置
在课程中提供的实验流程是基于虚拟机的Ubuntu系统来完成。但在配置环境过程中,经常可能出现一些问题,例如:与系统原有软件包冲突、运行环境配置复杂等,因此我选择了使用在课上学到的Docker技术来完成这个实验。同时我也将Docker镜像文件开源在saaak (王康) · GitHub上,基本达到了开箱即用。
首先编写DockerFile,基于Ubuntu18镜像来实现。
编写使用命令build镜像并run
sudo docker build -t debug-linux-kernel:latest
docker run \
-it debug-linux-kernel:latest \
/bin/bash
这样就启动好了我们所需要的实验运行环境。
2.2 编译内核
使用命令make defconfig 创建默认配置,然后使用
make menuconfig
打开图形化编译配置选项。
选择kernel hacking->Compile-time checks and compiler options
将Compile the kernel with debug info以及Provide GDB scripts for kernel debugging按Y选择,然后Save并退出。
在配置完成后使用命令开始编译内核。
make -j4 //4是编译时线程数量
编译完成后会有kernel ready之类的输出。
2.3 Qemu及GDB调试
使用命令启动Qemu,其中-S命令是暂停内核启动,等待gdb连接。-s命令是启动server,默认使用1234端口,如需更改调试的端口可以用-gdb tcp:port命令来取代-s命令,其中port是端口号。
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -s -S
启动之后另外打开一个Shell,使用docker ps -a命令找到刚刚启动的环境容器。
使用命令进入容器,注意要将Container_ID替换成你刚刚启动的容器id。
docker exec -it CONTAINER_ID /bin/bash
输入gdb vmlinux进入gdb调试。
使用命令连接另一个shell的Qemu进程。
target remote :1234
//remote后面要有空格,否则会把remote当成远程主机名来解析
建立连接后会有相应提示
使用b start_kernel命令在start_kernel处设置断点,然后输入c就会运行到start_kernel处并暂停。使用list吗命令可以查看到start_kernel函数附近的代码。
还可以使用next命令进行单步的调试。
同时也可以使用bt命令查看函数调用的栈信息。
三、总结
弥补了汇编和操作系统的知识盲区,同时从原来的只会使用Linux命令到现在对Linux系统的运行原理也有一定理解。看到了很多C语言的高级操作,惊叹于Linus等大牛的智慧。
不过自己也有一些不足之处,Linux内核代码已经发展到了两千万行,想在一个学期内对其有深入的理解是办不到的,因此还有许多问题没有找到清晰的答案。不过在将来碰到Linux相关问题时,也能够基于课程所学内容,以及几次实验的操作经验,找到问题的解决方向。
学号:423