转载说明
这篇文章借鉴了来自Linux博客教程的相关内容,因此文章类型设置为转载。
原因与目的
最近需要对Linux进行修改和测试,因此需要搭建内核的编译和测试平台。
我的方案是:
- 在
Ubuntu16.04
系统下对Linux
源码进行修改 - 使用相关交叉编译工具链如
gcc-arm-linux-gnueabi
编译系统源码 - 使用
QEMU
软件仿真出硬件平台,测试对象系统的系统行为
由于我是刚刚正式接触Linux
内核,如果文中出现错误还请批评指正。
准备相关工具
选择的操作系统是Ubuntu16.04
,为了软件安装的速度选择了华为的开源镜像,更改开源镜像之后需要更新软件源索引:
// 更新软件源索引
$ sudo apt update
然后安装交叉编译工具(因为当前你的系统平台一般是X86
,而模拟运行的平台是ARM
,两者的体系结构不一样,因此在X86
环境下需要使用交叉编译工具来讲代码编译成可以在ARM
平台下运行的可执行文件)。
// 安装交叉编译工具
$ sudo apt install c-compiler-arm-linux-gnueabi // C语言交叉编译工具链
$ sudo apt install c++-compiler-arm-linux-gnueabi // 可选,C++语言交叉编译工具链
接着,安装用于模拟ARM
硬件平台的软件QEMU
。
// 安装QEMU软件
sudo apt install qemu
根据QEMU
软件在官网的说明,我们可以在安装完毕之后键入qemu-system-然后按下Tab来查看QEMU
软件支持的目标仿真平台,由于我们想要仿真ARM
硬件平台,因此我们可以在出现的选项中找到qemu-system-arm
这个命令。接着,我们还可以执行qemu-system-arm -M help来查看QEMU
支持仿真的ARM
芯片列表。
需要注意的是,使用Ubuntu
官方仓库安装的QEMU
软件版本较老不支持很多新的功能,需要使用新功能的话可以根据Github
上QEMU
项目的官方教程下载最新版本的源码进行编译安装。
编译Linux
内核源码
首先,我们需要从Linux内核官网上下载Linux
内核源码(版本根据个人喜好,我选择了5.1.2
版本源码进行编译)。
建议使用专业下载工具下载压缩包再拷贝至Ubuntu系统中(使用wget
下载压缩包的速度实在是太慢了)。
新建一个目录Kernel
并修改该目录的执行权限。
// 新建文件夹并设置权限
$ mkdir Kernel
$ chmod 777 Kernel
接着,将下载的压缩包的所有内容(解压后文件夹内的内容)解压到Kernel
目录下,并进入Kernel
目录下,此时该目录是Linux
内核源码的根目录。
然后,使用以下命令编译Linux
内核源码。
// 指定交叉编译工具链,指定芯片框架为ARM,由此生成ARM芯片的配置文件
$ make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
// 指定交叉编译工具链,指定芯片框架为ARM,编译Linux源码
$ make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
编译完成后,生成的内核镜像是arch/arm/boot/zImage
。
此时我们就可以使用以下命令来测试内核镜像是否可以运行。
// 在根目录下执行以下命令
qemu-system-arm -M vexpress-a9 \
-m 512M \
-kernel path/arch/arm/boot/zImage \
-dtb path/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic
上述命令中:
-M
:指定硬件芯片框架-m
:指定运行内存大小-kernel
:指定运行的内核镜像-dtb
:(不确定)指定具体芯片的配置信息-nographic
:指定不适用图形界面
内核启动之后,如果最后一行显示end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
,说明内核可以正常启动,只是暂时缺少根文件系统。
制作根文件目录
(后续更新)