使用QEMU实现vexpress-ca9板卡的linux启动
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用QEMU实现vexpress-ca9板卡的linux启动相关的知识,希望对你有一定的参考价值。
一、安装qemu
我们直接通过命令行输入:
sudo apt install qemu qemu-system-arm qemu-user
即可,如果发现下载失败,下面也会给出提示:让你更新一下软件包:sudo apt update
我这里是已经安装好了:
二、配置交叉编译器
使用arm-none-linux-gnueabihf-gcc
工具链
这一步的话在上一个实验中就已经配置过了,不过注意的是我们需要去 start.sh
新增配置ARCH
和CROSS_COMPILE
两个环境变量
配置如下:
注意我这里的PATH
可能和你的不一样,根据你的arm-none-linux-gnueabihf/bin
的位置进行调整
然后我们再在start.sh
同目录中执行 source start.sh
就将环境激活啦
这里给出目录结构
三、编译uboot(可省略)
后面补上,目前不用
四、编译Linux内核
注意在这下面的所有部分都是需要激活环境!!!,否则会出问题
解压到工作目录
我们将linux-5.10.tar.xz
压缩包上传到我们指定的目录下,我这里是上传到/home/mangata/lib/lib2
这里的,然后执行解压命令:tar -Jxvf linux-5.10.tar.xz
解压到当前目录
配置内核
进入linux-5.10
目录,然后输入make vexpress_defconfig
,注意这里可能会报错
mangata@mangata:~/lib/lib2/linux-5.10$ make vexpress_defconfig
LEX scripts/kconfig/lexer.lex.c
/bin/sh: 1: flex: not found
make[1]: *** [scripts/Makefile.host:9:scripts/kconfig/lexer.lex.c] 错误 127
make: *** [Makefile:602:vexpress_defconfig] 错误 2
其实是词法解析器flex,和语法解析器bison没有安装,于是我们输入下面语句安装即可:
sudo apt install flex bison
然后在当前目录执行:make vexpress_defconfig
会给出如下警告,其实不用管,这是说我们的版本号数字是非法的,但是不太影响
mangata@mangata:~/lib/lib2/linux-5.10$ make vexpress_defconfig
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
init/Kconfig:38:warning: 'LD_VERSION': number is invalid
#
# configuration written to .config
#
编译内核镜像
我们继续在当前目录输入make zImage -j4
即可开始编译内核镜像,注意的是这里的4
是根据你虚拟机的核心设置来的,比如我这里就是4核,根据你的核心数进行调整即可
然后就是**“漫长”**的编译过程了
编译完成后就是这个样子了:
生成设备树文件
我们再在当前目录输入make dtbs
生成设备树文件
mangata@mangata:~/lib/lib2/linux-5.10$ make dtbs
DTC arch/arm/boot/dts/vexpress-v2p-ca5s.dtb
DTC arch/arm/boot/dts/vexpress-v2p-ca9.dtb
DTC arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb
DTC arch/arm/boot/dts/vexpress-v2p-ca15_a7.dtb
拷贝生成文件到模拟环境
我们先在/home/mangata/lib/lib2
目录中通过mkdir build
创建build
目录,然后再进入linux-5.10
将zImage
和vexpress-v2p-ca9.dtb
文件拷贝到build
目录中,方便后面的启动
mangata@mangata:~/lib/lib2$ mkdir build
mangata@mangata:~/lib/lib2$ ls
build linux-5.10 linux-5.10.tar.xz rootfs0328.ext3
mangata@mangata:~/lib/lib2$ cd linux-5.10/
mangata@mangata:~/lib/lib2/linux-5.10$ cp arch/arm/boot/zImage ../build/
mangata@mangata:~/lib/lib2/linux-5.10$ cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../build/
mangata@mangata:~/lib/lib2/linux-5.10$ pwd
/home/mangata/lib/lib2/linux-5.10
使用qemu测试linux内核启动
如果直接通过qemu-system-arm -nographic -M vexpress-a9 -m 512M -kernel build/zImage -dtb build/vexpress-v2p-ca9.dtb -append "console=ttyAMA0"
启动的话,我们没有根文件系统,内核启动会出现panic
:
VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
1f00 131072 mtdblock0
(driver?)
1f01 32768 mtdblock1
(driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.10.0 #1
Hardware name: ARM-Versatile Express
[<8010f124>] (unwind_backtrace) from [<8010af8c>] (show_stack+0x10/0x14)
[<8010af8c>] (show_stack) from [<8080b5a4>] (dump_stack+0x94/0xa8)
[<8080b5a4>] (dump_stack) from [<80807668>] (panic+0x10c/0x310)
[<80807668>] (panic) from [<80b015b8>] (mount_block_root+0x1e8/0x26c)
[<80b015b8>] (mount_block_root) from [<80b018fc>] (prepare_namespace+0x150/0x18c)
[<80b018fc>] (prepare_namespace) from [<8080fdb0>] (kernel_init+0x8/0x118)
[<8080fdb0>] (kernel_init) from [<80100148>] (ret_from_fork+0x14/0x2c)
Exception stack(0x810affb0 to 0x810afff8)
ffa0: 00000000 00000000 00000000 00000000
ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
注意这里按ctrl+C
是不能退出的,我们需要先按住ctrl+A
然后两个键都松开,再按X
所以我们需要指定挂在根文件系统,我这里使用的是rootfs0328.ext3
五、挂载rootfs
在刚才的路径中执行:sudo qemu-system-arm -nographic -M vexpress-a9 -m 512M -kernel build/zImage -dtb build/vexpress-v2p-ca9.dtb -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs0328.ext3
我们创建一个shell
脚本run_vexpress.sh
,然后每次执行就好了,不用每次输入那么长的命令:
如果这里创建好后不能执行,那么可以给他加上执行权限,我这里省事直接chmod 777 run_vexpress.sh
,但是这不是一个好习惯
然后我们执行脚本:sudo ./run_vexpress.sh
然后我们按一下回车键就能进入我们模拟的这个Linux
了
Please press Enter to activate this console.
[root@localhost ]# ls
a.c etc linuxrc sbin usr
bin home lost+found sys var
dev lib proc tmp
[root@localhost ]# cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 1574.50
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc09
CPU revision : 0
Hardware : ARM-Versatile Express
Revision : 0000
Serial : 0000000000000000
[root@localhost ]#
注意的是在这个系统中没有移植vim
只移植了vi
关于实验中用到的资源可以通过下面链接下载:
链接:https://pan.baidu.com/s/1FhRoErqdsOrpy34hU62dEw
提取码:zbhc
到这里这个实验就完完整整的做完啦!
以上是关于使用QEMU实现vexpress-ca9板卡的linux启动的主要内容,如果未能解决你的问题,请参考以下文章
查看内核页表kernel_page_tables (aarch32)