Linux内核入门(一):交叉编译Linux内核并使用QEMU仿真硬件运行Linux系统

转载说明

这篇文章借鉴了来自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软件版本较老不支持很多新的功能,需要使用新功能的话可以根据GithubQEMU项目的官方教程下载最新版本的源码进行编译安装。

编译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),说明内核可以正常启动,只是暂时缺少根文件系统。

制作根文件目录

(后续更新)

你可能感兴趣的:(Linux系统开发)