“中美贸易战了,咱们才发现原来咱们的操作系统是单薄的,国内居然没有能够独当一面的操作系统,咱们服务器都用红帽或者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上。
发表回复