使用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 新增配置ARCHCROSS_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.10zImagevexpress-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启动的主要内容,如果未能解决你的问题,请参考以下文章

Yeelink初步体验

Yeelink初步体验

Yeelink初步体验

查看内核页表kernel_page_tables (aarch32)

9- 基于6U VPX的 XC7VX690T+C6678的双FMC接口雷达通信处理板 C6678板卡

Yocto tips (20): Yocto中qemu模拟器的使用,以zynq Cortex-A9为例