“中美贸易战了,我们才发觉原先我们的操作系统是薄弱的,国外居然没有可以独当一面的操作系统arm linux内核编译,我们服务器都用红帽或则centos,手机都用安卓,PC都用苹果或则windows。Linux内核是是我们操作系统最好的弯道会车。如今早已是Linux5.0时代了,代码量远超2000w行,面对纷繁复杂的内核代码,怎么高效学习Linux内核?
一个能单步调试最新内核的实验平台很重要,非常是使用“O0”来编译内核,能让你在调试内核过程中游鱼得水,深刻体悟linux内核代码的真谛。”
01
—
使用busybox工具制做的最小文件系统,该最小系统仅仅包含了Linux系统最常用的命令,如ls,top等命令。假如要在此最小系统中进行systemtap以及kdump等试验的话,我们须要自动编译和安装这种工具,这个过程是相当复杂和繁杂的。因此,我们尝试使用Debian的根文件系统来构造一个精巧并且好用的实验平台。在这个实验平台中,读者可以在线安装丰富的软件包,例如kdump,crash什么是linux,systemtap等工具。这个实验平台具有如下特征:
使用“O0”来编译内核
在主机Host中编译内核
使用QEMU来加载系统
支持GDB单步调试内核以及Debian系统
使用ARM64版本的Debian系统的根文件系统
在线安装Debian软件包
支持在虚拟机里动态编译内核模块
支持Host主机和虚拟机共享文件
这个runninglinuxkernel内核默认使用GCC的“O0”优化等级来编译的。读者可能发觉gdb在单步调试内核时会出现光标乱跳而且难以复印有些变量的值(比如出现)等问题,虽然这不是gdb或QEMU的问题。是由于内核编译的默认优化选项是O2ubuntu linux,因而若果不希望光标乱跳,可以尝试把linux-5.0根目录Makefile中的O2改成O0,然而这样编译时有问题,作者因此做了一些更改。最后须要特别说明一下,使用GCC的“O0”优化等级编译内核会造成内核运行性能增长,因而我们仅仅是为了便捷单步调试内核。
(1)安装工具
首先在UbuntuLinux18.04中安装如下工具。
$sudoapt-getinstallqemulibncurses5-devgcc-aarch64-linux-gnubuild-essentialgit
(2)编译内核以及制做文件系统
在runninglinuxkernel目录下边有一个rootfs_debian_arm64.tar.xz文件,这个是基于ARM64版本的Debian系统的根文件系统。并且这个根文件系统还只是一个半成品,我们还须要依照编译好的内核来安装内核镜像和内核模块。整个过程比较复杂:
编译内核
编译内核模块
安装内核模块
安装内核头文件
安装编译内核模块必须依赖文件
制做ext4根文件系统
这个过程比较冗长,作者制做了一个脚本来简化上述过程。
注意,该脚本会使用dd命令来世成一个8GB大小的镜像文件arm linux内核编译,因而主机系统须要保证起码须要10个GB的空余c盘空间。若读者须要生成一个更大的根文件系统镜像,可以修该run_debian_arm64.sh这个脚本文件。
$cdrunninglinuxkernel-5.0
$./run_debian_arm64.shbuild
执行上述脚本须要几十分钟,依赖于主机的估算能力。
(3)运行刚刚编译好的ARM64版本的Debian系统。
运行run_debian_arm64.sh脚本,输入run参数即可。
$sudo./run_debian_arm64.shrun
运行的结果如下:
$sudo./run_debian_arm64.shrun
登陆Debian系统:
用户名:root或则benshushu
密码:123
在线安装软件。
另外你们可以使用本实验平台来玩kdump+crash实验。
图形化单步调试内核是必备的绝门必杀技了。eclipse有一个用处,可以边单步边查看复杂数据结构的成员的值,例如task_struct,mm_struct等数据结构。只有通过trace调试,你就能保证你的理解是和处理器的理解是一样的。笨叔发觉,好多时侯我们都偏颇了,通过trace单步跑一遍,发觉自己理解居然和处理器跑的不一样,打脸了!并且这些情况还经常发生!
目前这个实验平台暂时开放给订购过笨叔旗舰篇视频的男子伴试用,等笨叔红色奔跑吧v2修订版出版以后会上传到github上。