“中美贸易战了,我们才发现原来我们的操作系统是薄弱的,国内竟然没有可以独当一面的操作系统,我们服务器都用红帽或者centos,手机都用安卓,PC都用苹果或者windows。Linux内核是是我们操作系统最好的弯道超车。现在已经是Linux 5.0时代了,代码量远超2000w行,面对错综复杂的内核代码,如何高效学习Linux内核?
一个能单步调试最新内核的实验平台很重要,特别是使用“O0”来编译内核,能让你在调试内核过程中游鱼得水,深刻领悟linux内核代码的精髓。”
01
使用busybox工具制作的最小文件系统,该最小系统仅仅包含了Linux系统最常用的命令,如ls,top等命令。如果要在此最小系统中进行systemtap以及kdump等试验的话,我们需要手动编译和安装这些工具,这个过程是相当复杂和繁琐的。为此,我们尝试使用Debian的根文件系统来构造一个小巧而且好用的实验平台。在这个实验平台中,读者可以在线安装丰富的软件包,比如kdump,crash,systemtap等工具。这个实验平台具有如下特点:
使用“O0”来编译内核
在主机Host中编译内核
使用QEMU来加载系统
支持GDB单步调试内核以及Debian系统
使用ARM64版本的Debian系统的根文件系统
在线安装Debian软件包
支持在虚拟机里动态编译内核模块
支持Host主机和虚拟机共享文件
这个runninglinuxkernel内核默认使用GCC的“O0”优化等级来编译的。读者可能发现gdb在单步调试内核时会出现光标乱跳并且无法打印有些变量的值(例如出现
(1)安装工具
首先在Ubuntu Linux 18.04中安装如下工具。
$ sudo apt-get install qemu libncurses5-dev gcc-aarch64-linux-gnu build- essential git
(2)编译内核以及制作文件系统
在runninglinuxkernel目录下面有一个rootfs_debian_arm64.tar.xz文件,这个是基于ARM64版本的Debian系统的根文件系统。但是这个根文件系统还只是一个半成品,我们还需要根据编译好的内核来安装内核镜像和内核模块。整个过程比较复杂:
编译内核
编译内核模块
安装内核模块
安装内核头文件
安装编译内核模块必须依赖文件
制作ext4根文件系统
这个过程比较繁琐,作者制作了一个脚本来简化上述过程。
注意,该脚本会使用dd命令来生成一个8GB大小的镜像文件,因此主机系统需要保证至少需要10个GB的空余磁盘空间。若读者需要生成一个更大的根文件系统镜像,可以修该run_debian_arm64.sh这个脚本文件。
$ cd runninglinuxkernel-5.0
$ ./run_debian_arm64.sh build
执行上述脚本需要几十分钟,依赖于主机的计算能力。
(3)运行刚才编译好的ARM64版本的Debian系统。
运行run_debian_arm64.sh脚本,输入run参数即可。
$ sudo ./run_debian_arm64.sh run
运行的结果如下:
$ sudo ./run_debian_arm64.sh run
登录Debian系统:
用户名:root 或者 benshushu
密码:123
在线安装软件。
另外大家可以使用本实验平台来玩kdump+crash实验。
图形化单步调试内核是必备的绝门必杀技了。eclipse 有一个好处,可以边单步边查看复杂数据结构的成员的值,比如task_struct,mm_struct等数据结构。只有通过trace调试,你才能保证你的理解是和处理器的理解是一样的。笨叔发现,很多时候我们都想当然了,通过trace单步跑一遍,发现自己理解竟然和处理器跑的不一样,打脸了!而且这种情况还时常发生!
目前这个实验平台暂时开放给购买过笨叔旗舰篇视频的小伙伴试用,等笨叔蓝色奔跑吧v2修订版出版之后会上传到github上。