《深入理解Linux内核》实验环境搭建
背景
前前后后看《深入理解Linux内核》这本书也有两三遍了,每次刚开始都是决心满满的开始,但是都是以失望而结束,对内核的理解也一直只是停留在一些基本概念的掌握,真正深入到各种机制及实现还是完全一窍不通。所以就在网上找了下一些前辈的学习方法,大部分的建议都是基于代码和实验去深入的学习。
基于此,所以搭建实验环境就是开始的第一步,由于《深入理解Linux内核》参考的内核版本是Linux v2.6.11.12,属于比较的老的版本,编译该版本所依赖的一些工具也只能用一些较老的版本(可以通过查看Documentations/Changes)。如果完全去找到这些工具并安装其实也是挺费劲的一件事,所以就在网上找到了两个别人搭好的现成的环境来使用,并且这两套实验环境当前也有人一直在维护,碰到问题他们也会及时响应。
这两个工具是:
1. http://tinylab.org/linux-lab/: 本文主要是基于该环境进行讲解。
2. https://biscuitos.github.io/
依赖软件及cloud-lab获取
- Git
- Docker
- 下载cloud-lab: git clone https://gitee.com/tinylab/cloud-lab.git (注意一定不能用root用户来clone)
使用步骤
- 下载完后进入到cloud-lab目录,选择linux-lab:
cd cloud-lab/ && tools/docker/choose linux-lab
- 启动Linux-lab, 选择bash登录:
- 查看支持的开发板
make list
- 选择开发板,我们的书籍主要是讲X86架构,所以选择i386/pc:
- 查看该块板子支持的内核版本:
ubuntu@linux-lab:/labs/linux-lab$ make list-linux
v2.6.10 v2.6.11.12 v2.6.12.6 v2.6.21.5 v2.6.24.7 v2.6.34.9 v2.6.35.14 v2.6.36 v4.6.7 [v5.1] v5.2
- 由于《深入理解Linux内核》是以v2.6.11.12为示例讲解的,所以切到这个版本:
ubuntu@linux-lab:/labs/linux-lab$ make local-config LINUX=v2.6.11.12
tools/board/config.sh LINUX=v2.6.11.12 /labs/linux-lab/boards/i386/pc/.labconfig v2.6.11.12;
LINUX := v2.6.11.12 /labs/linux-lab/boards/i386/pc/.labconfig
- 编译内核:
make build kernel
编译产生的文件在:
shawn@shawn-ThinkPad-T480:~/cloud-lab/labs/linux-lab/build/i386/linux-v2.6.11.12-pc$ pwd
/home/shawn/cloud-lab/labs/linux-lab/build/i386/linux-v2.6.11.12-pc
如果是第一次编译的话,首先会将代码下载下来,并放在:
shawn@shawn-ThinkPad-T480:~/cloud-lab/labs/linux-lab/src/linux-stable$ pwd
/home/shawn/cloud-lab/labs/linux-lab/src/linux-stable
- 启动内核: make boot, 实验用的Linux系统的用户名为root,没有密码:
- 内核的配置
make menuconfig kernel
默认配置存放在如下目录:
shawn@shawn-ThinkPad-T480:~/cloud-lab/labs/linux-lab/boards/i386/pc/bsp/configs$ pwd
/home/shawn/cloud-lab/labs/linux-lab/boards/i386/pc/bsp/configs
shawn@shawn-ThinkPad-T480:~/cloud-lab/labs/linux-lab/boards/i386/pc/bsp/configs$ ls
buildroot_2019.02.2_defconfig linux_v2.6.12.6_defconfig linux_v2.6.35.14_defconfig linux_v4.6.7_defconfig
buildroot_2019.11_defconfig linux_v2.6.21.5_defconfig linux_v2.6.36_defconfig linux_v5.1_defconfig
linux_v2.6.10_defconfig linux_v2.6.24.7_defconfig linux_v2.6.38_defconfig linux_v5.2_defconfig
linux_v2.6.11.12_defconfig linux_v2.6.34.9_defconfig linux_v4.4_defconfig
- 通过tftp实现与主机的文件共享:
在 Qemu 开发板上运行 tftp 命令访问主机的 tftp 服务器。
主机侧:
$ ifconfig br0
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
$ cd tftpboot/
$ ls tftpboot
kft.patch kft.log
Qemu 开发板:
$ ls
kft_data.log
$ tftp -g -r kft.patch 172.17.0.3
$ tftp -p -r kft.log -l kft_data.log 172.17.0.3
注意: 当把文件从 Qemu 开发板发送到主机侧时,必须先在主机上创建一个空的文件,这是一个 bug?!
- GDB调试Linux内核:
1)使用调试选项编译内核:
2) 开两个终端并都进入到linux-lab内:$ make feature f=debug $ make kernel-olddefconfig $ make kernel
$ make debug
打开另外一个新的终端窗口,请通过相应方式再登陆一次 Linux Lab,再次运行如下命令即可:
$ make debug
gdb的默认初始化脚本在labs/linux-lab.gdb/kernel.default,可以根据自己的需要修改
cloud-lab官方网站
官方网址: http://tinylab.org/cloud-lab
gitee 上的项目地址:https://gitee.com/tinylab/cloud-lab