Linux操作系统分析学习总结

参考资料:《庖丁解牛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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值