关注囧囧妹微信公众号了解更多内容。
一、开篇
最近在看qemu,所以尝试使用qemu来运行一个内核。
关于介绍就不多说了,可以直接网上搜索,这里记录下运行起来的过程。
二、编译内核
使用指令apt install gcc-arm-linux-gnueabi来安装交叉编译工具
apt install gcc-arm-linux-gnueabi
gcc-arm-linux-gnueabi和gcc-arm-linux-gnueabihf的区别:gcc-arm-linux-gnueabi是针对软浮点运算,gcc-arm-linux-gnueabihf针对硬浮点运算。
使用指令wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.10.99.tar.xz来下载内核,这里使用的国内镜像,速度快。
下载完成后通过tar -xvf linux-5.10.99.tar.xz来解压出内核。
进入内核目录,修改内核根目录Makefile如下:
在编译前我们先安装一些软件:
sudo apt-get install flex bison libncurses-dev
sudo apt-get install u-boot-tools
配置编译:
make vexpress_defconfig
make menuconfig
我这里用的默认的配置,感兴趣的可以在make menuconfig执行后来对内核进行裁剪。
配置完成后就可以编译了。
make zImage -j2
make modules -j2
make dtbs -j2
然后指定内核的加载地址:
make LOADADDR=0x60003000 uImage -j2
这里我遇到了问题,需要通过sudo apt install u-boot-tools来安装uboot-tools。
然后把内核和设备树拷贝到一个目录里:
cp arch/arm/boot/zImage ../../../tftpboot/
cp arch/arm/boot/uImage ../../../tftpboot/
cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../../../tftpboot/
在同一个目录下,创建一个qemu的启动脚本start.sh:
qemu-system-arm -M vexpress-a9 \
-m 512M \
-kernel zImage \
-dtb vexpress-v2p-ca9.dtb \
-nographic \
-append "console=ttyAMA0"
通过source start.sh启动qemu:
上面就把一个内核引导启动起来了,但是在启动最后我们发现有个错误如下图,根据最后的kernel panic提示可以知道因为我们没有挂载文件系统导致的错误。