“中美贸易战了,咱们才发现原来咱们的操作系统是单薄的,国内居然没有能够独当一面的操作系统,咱们服务器都用红帽或者 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 在单步调试内核时会呈现光标乱跳并且无奈打印有些变量的值(例如呈现 <optimized out>)等问题,其实这不是 gdb 或 QEMU 的问题。是因为内核编译的默认优化选项是 O2,因而如果不心愿光标乱跳,能够尝试把 linux-5.0 根目录 Makefile 中的 O2 改成 O0,然而这样编译时有问题,作者为此做了一些批改。最初须要特地阐明一下,应用 GCC 的“O0”优化等级编译内核会导致内核运行性能降落,因而咱们仅仅是为了不便单步调试内核。
(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 上。