配置过程中参考了各方面的资料和文章,中间还是出了很多奇奇怪怪的bug (其实是本人太菜)
记录一下一些值得注意的点,防止以后踏入相同误区
这里使用的是 centos8 系统进行配置
需要注意的一点,我当时使用虚拟机运行的centos,配置内存有点小,qemu整个编译下来好几个G加上其他文件等等 最好虚拟机留出25G以上免得以后使用麻烦
首先是 arm交叉编译链安装 ,注意解压后的环境变量配置
vim /etc/profile
最下面添加export PATH=$PATH:/home/yl/arm-2014.05/bin 这个路径就是自己安装的arm编译链的bin文件夹的绝对路径
然后 source /etc/profile更新文件
保险起见可以先测试一下
arm-none-linux-gnueabi-gcc -v (arm-none-linux-gnueabi-gcc就是bin下的执行文件,好像还有一种版本是arm-linux-gnueabi-gcc 总之去bin目录下ls看一下)
****然后这里就出现了第一个令人费解的问题, 出现错误arm-none-linux-gnueabi-gcc:command not found,但是去bin目录下却能找到该文件。经过网上查找得知是64位系统不兼容32位的原因(可能是这里我使用的arm编译链资源版本低了?),上网找了一遍好多方法大都很麻烦,由于只是运行这一个小命令,找到的一个相对简单的办法就是安装32位clib
yum install glibc.i686 后解决问题
然后安装qemu 这部按操作基本没什么问题 网上教程也有很多可以参考
下一步安装uboot 解压后进入uboot下执行
export ARCH=arm
export CROSS_COMPILE=/home/yl/arm-2014.05/arm-none-linux-gnueabi-
(为了方便,直接引入了绝对路径 )
然后
make vexpress_ca9x4_defconfig
make
注意一下目录下是否有uboot文件生成
配置内核
同样解压后进入目录
export ARCH=arm
export CROSS_COMPILE=/home/yl/arm-2014.05/arm-none-linux-gnueabi-
make vexpress_defconfig
make zImage
make modules
make dtbs
执行make zImage中出现了错误,少了两个库 ,直接使用yum install +库名补全
应该在arch/arm/boot 目录下生成 zImage 文件
到这之后,为了避免后面问题堆积,最好先运行一下qemu加载一下内核,看是否有问题。
qemu-system-arm \
-M vexpress-a9 -m 512M \
-kernel /home/yl/linux-4.0/arch/arm/boot/zImage \
-dtb /home/yl/linux-4.0/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append “console=ttyAMA0”
第一次执行时用的linux-5.1的内核,执行此语句时卡死,控制台没有输出,查资料后猜想可能是kernel版本高了,又下了linux-4.0的,这才有输出,提示
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) 这很正常,因为还没开始制作根文件呢。
接下来制作根文件,也是我问题最大的部分
网上有很多文章用脚本直接执行的根文件制作,但是我试过的基本上都没能成功解决我的问题执行到最后一步出现arm unable to mount root fs on unknown-block(0,0)
这里说的是创建的跟文件没有挂载,按照网上的脚本我做了改进,代码如下:
注意使用root身份运行不然权限不够
mkrootfs.sh
rm -rf rootfs
rm -rf tmpfs
rm -f a9rootfs.ext3
mkdir rootfs
cp /home/yl/busybox-1.29.0/_install/* rootfs/ -raf #可以使用相对路径或绝对路径
mkdir -p rootfs/proc/
mkdir -p rootfs/sys/
mkdir -p rootfs/tmp/
mkdir -p rootfs/root/
mkdir -p rootfs/var/
mkdir -p rootfs/mnt/
cp -arf /home/yl/arm-2014.05/arm-none-linux-gnueabi/lib rootfs/ #可以使用相对路径或绝对路径
#rm rootfs/lib/*.a
cp /home/yl/arm-2014.05/bin/arm-none-linux-gnueabi-strip rootfs/lib/*
mkdir -p rootfs/dev/
mknod rootfs/dev/tty1 c 4 1
mknod rootfs/dev/tty2 c 4 2
mknod rootfs/dev/tty3 c 4 3
mknod rootfs/dev/tty4 c 4 4
mknod rootfs/dev/console c 5 1
mknod rootfs/dev/null c 1 3
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
mkfs.ext3 a9rootfs.ext3
mount -t ext3 a9rootfs.ext3 rootfs #####这里添上了一句 ,将rootfs挂载在a9rootfs.ext3上,
#我并没有找到相关的文章有说明,但是每次运行都提示rootfs未挂载,这里强行挂载上
以上就是我配置过程中遇到的主要问题。解决后使用命令
qemu-system-arm -M vexpress-a9 \
-m 512M -kernel /home/yl/linux-4.0/arch/arm/boot/zImage \
-dtb /home/yl/linux-4.0/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append “root=/dev/mmcblk0 rw console=ttyAMA0” \
-sd a9rootfs.ext3
也可以写入start.sh用于快捷执行。
注意这里也必须用root身份执行,我在普通用户身份下执行会报错
运行成功后
这里提示不能运行 run etc/init.d/rcS 因为没有下载 etc的文件