运行实验平台:第一个由“O0”RedHat或centos编译的Linux5.0内核,手机使用Android,PC使用Apple或Windows。Linux内核是我们操作系统最好的弯道超车。现在是Linux5.0时代,代码量远不止2000w。内核代码,如何高效学习Linux内核?一个可以一步步调试最新内核的实验平台非常重要,尤其是使用“O0”编译内核,可以让你在调试内核的过程中畅游,深刻理解linux内核代码的精髓。”01使用busybox工具制作的最小文件系统,里面只包含了linux系统中最常用的命令,比如ls,top等命令,如果要在这个最小系统中测试systemtap和kdump,需要手动编译安装这些工具,相当复杂繁琐,为此,我们尝试利用Debian的根文件系统搭建一个小巧易用的实验平台,在这个实验平台上,读者可以在线安装丰富的软件包,如kdump、crash、systemtap等工具。本实验平台具有以下特点:?使用“O0”编译内核?在宿主机Host中编译内核?使用QEMU加载系统?支持GDB单步执行内核和Debian系统的调试?使用ARM64版本Debian系统的根文件系统?在线安装Debian软件包?支持在虚拟机中动态编译内核模块?支持宿主机和虚拟机共享文件运行的linuxkernel内核是默认情况下使用GCC的“O0”优化级别编译。读者可能会发现gdb在单步调试内核时,光标乱跳,无法打印出某些变量的值(比如出现)。其实这不是gdb或QEMU的问题。是因为内核编译的默认优化选项是O2,所以如果不想让光标跳来跳去,可以尝试将linux-5.0根目录的Makefile中的O2改成O0,但是有个问题在这样编译的时候,作者为此做了一些修改。最后需要特别说明的是,用GCC的“O0”优化级别编译内核会导致内核的性能下降,所以我们只是为了方便内核的单步调试。(1)安装工具首先在UbuntuLinux18.04中安装以下工具。$sudoapt-getinstallqemulibncurses5-devgcc-aarch64-linux-gnubuild-essentialgit(二)编译内核并制作文件系统在runninglinuxkernel目录下有一个rootfs_debian_arm64.tar.xz文件,它是基于ARM64版本的Debian系统的根文件系统。但是这个根文件系统只是一个半成品,我们还需要根据编译好的内核安装内核镜像和内核模块。整个过程比较复杂:?编译内核?编译内核模块?安装内核模块?安装内核头文件?安装编译内核模块必须依赖文件?制作ext4根文件系统的过程繁琐。作者做了一个脚本来简化上面的过程。注意脚本会使用dd命令生成一个8GB的镜像文件,所以主机系统需要保证至少10GB的可用磁盘空间。如果读者需要生成更大的根文件系统镜像,可以修改脚本文件run_debian_arm64.sh。$cdrunninglinuxkernel-5.0$./run_debian_arm64.shbuild执行上面的脚本需要几十分钟,取决于主机的计算能力。(3)运行刚刚编译好的ARM64版本的Debian系统。运行run_debian_arm64.sh脚本并输入运行参数。$sudo./run_debian_arm64.shrun结果如下:$sudo./run_debian_arm64.shrun登录Debian系统:?用户名:root或benshushu?密码:123在线安装软件。另外,你可以使用这个实验平台来玩kdump+crash实验。图形化单步调试内核是必备技能。eclipse的一个好处就是可以边步进边查看复杂数据结构成员的值,比如task_struct、mm_struct等数据结构。只有通过跟踪调试才能保证你的理解和处理器的理解是一样的。笨叔发现,很多时候我们都想当然,一步步跑过trace,发现自己的理解和处理器的理解不一样,简直就是在打脸!而且它一直在发生!目前本实验平台暂时开放给购买了本大叔旗舰视频的朋友试用,待本大叔的蓝跑吧v2改版发布后上传至github。