linux kernel + busybox + qemu
Linux kernel development (1): 环境准备
寻坑之旅
linux kernel
打包上路
获取linux kernel源代码。因为书中根据的源代码是2.6,所以就只选择了这个版本。
可以从 这里获取 https://www.kernel.org/pub/linux/kernel/v2.6/ 比如:
解压,会详细的列出解压的文件,解压后的文件会保存在linux-2.6.39文件夹中:
或者使用git,(这个会下载很大的文件)
然后根据需要的版本checkout出来。
进入解压出来的文件夹。接下去配置(config)内核。根据网上的方法,对于ubuntu系统,可以直接把/boot/ 里的.config
文件拷贝到linux-2.6.32中。这里用用make menuconfig 来进行图形化配置内核并生成 .confgi文件:
不想进行个性化配置的话,可以使用默认生成的.config,我这里直接使用默认配置了:
其他一些类似命令,这里仅列出:
- make oldconfig 使用已经存在的 ./.config的内容,将里面的原本值作为新config的设定值。新config中涉及的新特性则列出来让用户选择。
- make gconfig 用Gtx图形界面来配置。需要X window支持。
- make xconfig 用Qt图形界面来配置。需要X window支持。
- make config
配置完(我直接保持默认配置没进行改动)后,选择 Save an Alternate Configuration File
,将配置保存到 .config 文件中。
接下里开始make
在make all中可能会遇到各种坑,遇到的话看这把。ps,好像make module可以不用。
最后编译完成:
生成的镜像存放在 arch/x86/boot/bzImage。
正式填坑
这次是第一次,但绝不会是最后一次编译内核。所以这部份会长期保持更新。希望对各位有用。
有可能在make all的时候出现下面这些错误:
坑一
原因是 不支持gcc-5编译。可以到这里去下一份对应的compiler-gcc5.h。放到 include/linux/compiler-gcc5.h
坑二
编辑 kernel/timeconst.pl ,第372行左右:
修改为:
坑三
|
|
google/stackoverflow上没找到解决方案。
我直接修改了由make defconfig
生成的.config
文件,其中第1781左右,是关于图形化(Graphics support)的部分,修改参数为如下:
busybox
busybox里面集成了多种常用linux命令。接下去需要用busybox来生成linux的根文件系统。
在 https://busybox.net/ 处下载源码,我下的版本是 BusyBox 1.27.2。
解压缩:
进入busybox文件夹,需要使用静态链接的方式来编译:
先进入 Busybox Setting,之后选择Build Options中的 Build Busybox as a static library。
|
|
安装成功。
install后,默认会在busybox的目录下生成一个 _install
目录。接下来用这个目录来生成虚拟机挂载时需要的根文件目录。
这一步,创建一个目录用于保存rootfs.img
生成:
结果:
Qemu
qemu是一个开源的虚拟机,它内部实现了一个gdb server,能方便和gdb对内核进行联合调试。安装qemu虚拟机:
用qemu开启虚拟机:
参数-kernel
,用于指定内核的所在地,在前面部分已经保存在为 linux-2.6.39/arch/x86/boot/bzImage 。参数-initrd
用于指定linux系统挂载用的根文件目录,由前面章节,已经保存在为 kernelrootfs/rootfs.img 。这两个参数,根据你前面的配置而定。
后记
还有一些其他的操作还没写出来,比如添加系统调用(syscall)之类的。以后用到再慢慢补充吧。