TinyEMU之Linux Kernel编译
- 1 准备工作
- 2 安装RISC-V交叉编译器
- 3 编译Linux Kernel
- 4 镜像格式转换
本文属于《 TinyEMU模拟器基础系列教程》之一,欢迎查看其它文章。
1 准备工作
我们需要,下载以下内容。
-
编译好的RISC-V交叉编译器:riscv64-glibc-ubuntu-20.04-nightly-2023.01.31-nightly.tar.gz
-
Linux内核源码:riscv-linux-riscv-linux-4.15.tar.gz
RISC-V交叉编译器,github仓库:https://github.com/riscv-collab/riscv-gnu-toolchain,也可以自己去选择,该仓库Release下其他版本的编译器。我们这里下载的是gcc version 12.2.0。
Linux内核源码,github仓库:https://github.com/riscvarchive/riscv-linux/tree/riscv-linux-4.15,我们这里与TinyEMU例子中,使用的Linux 4.15版本保持一致。
2 安装RISC-V交叉编译器
解压
tar -xvzf riscv64-glibc-ubuntu-20.04-nightly-2023.01.31-nightly.tar.gz
编辑.bashrc
vim ~/.bashrc
将编译器bin路径,加入.bashrc文件末尾
export PATH=/home/tools/riscv-gnu-toolchain-glibc/bin:$PATH
使路径生效
source ~/.bashrc
最后,查看编译器版本,以验证安装
riscv64-unknown-linux-gnu-gcc -v
编译器环境搭建好了。
3 编译Linux Kernel
解压
tar -xvzf riscv-linux-riscv-linux-4.15.tar.gz
将diskimage-linux-riscv-2018-09-23\patches\config_linux_riscv64,拷贝到riscv-linux-riscv-linux-4.15目录下,并修改文件名为.config。
- Linux中的.config文件是一个非常重要的配置文件,通常位于内核源码目录下,通过修改.config文件,用户可以启用或禁用某些内核功能,也可以调整各种参数和选项,以适应自己的使用环境。
- 说白了,就是可以选择哪些模块参与编译,哪些模块不参与编译,可进行功能的裁剪。
- 执行
make defconfig
,可生成的.config文件;执行make menuconfig
,可以修改.config文件。- 这里,我们使用TinyEMU例子中,提供的.config文件,就可以编译出,与例子中同样配置的Linux Kernel。
- 不知道diskimage-linux-riscv-2018-09-23是什么的,可查看前文《TinyEMU之源码编译与使用》。
使用交叉编译器,来编译Linux Kernel
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j64
遇到选择yes/no,默认回车即可。一会就编译完毕了。
编译完成后,在riscv-linux-riscv-linux-4.15目录下,生成了内核镜像文件:vmlinux。
使用file命令,查看其文件格式,为RISC-V的ELF格式。
4 镜像格式转换
在diskimage-linux-riscv-2018-09-23/readme.txt中,有明确描述:TinyEMU只支持原始(RAW)boot loader和kernel image。
因此,必须使用以下命令,将ELF格式镜像,转换为RAW格式镜像:
riscv64-unknown-linux-gnu-objcopy -O binary vmlinux kernel.bin
这个kernel.bin,才能在TinyEMU中,被正确加载执行。