QEMU在ubuntu模拟ARM vexpress-a9开发板

1.安装软件和交叉编译链接

sudo apt-get install zlib1g-dev  libglib2.0-0  libglib2.0-dev qemu 
sudo apt-get install qemu-system-arm
sudo apt-get install qemu-utils

sudo apt-get install gcc-arm-linux-gnueabi 

2. 编译内核

下载内核文件和解压缩:

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.7.tar.xz

tar xvJf linux-4.14.7.tar.xz

下面命令把vexpress_defconfig作为配置文件保存为.config,并根据这个config中的配置进行编译。

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -j8

编译得到内核文件arch/arm/boot/zImage,Qemu启动时需要指定使用这个映像文件。

3. 制作根文件系统

3.1 编译busybox

下载和解压缩busybox:

wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xf busybox-1.35.0.tar.bz2 

编译:

cd busybox-1.35.0/
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi- -j8
make install CROSS_COMPILE=arm-linux-gnueabi- -j8

编译生成的bin文件在busybox-1.35.0/_install/目录下

3.2 制作根文件系统镜像

切换到busybox的上级目录,并使用如下脚本制作镜像

#!/bin/bash

mkdir -p rootfs/{dev,etc/init.d,lib}
touch rootfs/etc/init.d/rcS
#这里用双引号可能会报错
echo -e '#!/bin/sh\n' > rootfs/etc/init.d/rcS
cp busybox-1.35.0/_install/* -r rootfs/
#sudo cp -P /usr/arm-linux-gnueabihf/lib/* rootfs/lib/
sudo cp /usr/arm-linux-gnueabihf/lib/sf/* rootfs/lib/

#ln -s bin/busybox rootfs/init
#ln -s -f bin/busybox rootfs/sbin/init

sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4

sudo chown root:root -R rootfs/*
sudo  chmod  777 rootfs/etc/init.d/rcS

qemu-img create -f raw disk.img 512M
mkfs -t ext4 ./disk.img
mkdir  -p   tmpfs
sudo mount -o loop ./disk.img tmpfs/
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs
file disk.img

镜像制作完成会生成 disk.img镜像

4. 启动虚拟机开发板

qemu-system-arm \
	-M vexpress-a9 \
	-m 512M \
	-kernel linux-4.14.7/arch/arm/boot/zImage \
	-dtb linux-4.14.7/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
	-nographic \
	-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
	-sd disk.img

关于qemu-system-arm命令各个参数详细解释如下:

  • -M vexpress-a9:表示使用vexpress-a9开发板的配置;
  • -m 512M:表示这只内存为512M;
  • -kernel xxx/arch/arm/boot/zImage:表示使用哪个内核镜像;
  • -dtb xxx/arch/arm/boot/dts/vexpress-v2p-ca9.dtb:表示使用哪个dtb文件;
  • -nographic:表示不启动图形化界面;
  • -append:表示设置kernel的cmdline;
  • -sd disk.img:表示使用sd卡上某个文件作为根文件系统;
  • qemu-system-arm -M help:可以查看支持的板子情况。

回车后出现如下界面代表成功:

Please press Enter to activate this console.
/ #
/ #
/ #

5.遭遇的问题

运行启动虚拟机开发板命令后,系统启动失败出现panic,如下打印:

...
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5220:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM default
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: No such file or directory
audio: Failed to create voice `lm4549.out'
mmcblk0: mmc0:4567 QEMU! 512 MiB
input: AT Raw Set 2 keyboard as /devices/platform/smb@4000000/smb@4000000:motherboard/smb@4000000:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0
aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 33
aaci-pl041 10004000.aaci: FIFO 512 entries
oprofile: using arm/armv7-ca9
NET: Registered protocol family 17
9pnet: Installing 9P2000 support
Registering SWP/SWPB emulation handler
rtc-pl031 10017000.rtc: setting system clock to 2024-04-16 14:01:03 UTC (1713276063)
ALSA device list:
  #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 33
input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb@4000000/smb@4000000:motherboard/smb@4000000:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2
EXT4-fs (mmcblk0): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (mmcblk0): Filesystem with huge files cannot be mounted RDWR without CONFIG_LBDAF
EXT2-fs (mmcblk0): error: couldn't mount because of unsupported optional features (2c0)
EXT4-fs (mmcblk0): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (mmcblk0): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 179:0.
Freeing unused kernel memory: 1024K
Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.7 #1
Hardware name: ARM-Versatile Express
[<8010f988>] (unwind_backtrace) from [<8010bb14>] (show_stack+0x10/0x14)
[<8010bb14>] (show_stack) from [<806533d0>] (dump_stack+0x84/0x98)
[<806533d0>] (dump_stack) from [<8011eb4c>] (panic+0xd8/0x244)
[<8011eb4c>] (panic) from [<80665dc0>] (kernel_init+0x104/0x10c)
[<80665dc0>] (kernel_init) from [<80107968>] (ret_from_fork+0x14/0x2c)
---[ end Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.

可能原因:

  1. 文件系统重init文件缺失,检查我的文件系统中init文件正常。故排除

    参考博客:buildroot编译内核启动报错:Kernel panic - not syncing: No working init found问题解决

  2. busybox编译时未进行交叉编译导致文件为不是arm架构文件,file rootfs/bin/busybox命令查看并无问题。故排除

    参考博客:CentOS 7 利用qemu模拟ARM vexpress A9开发板

  3. 交叉编译库未正常拷贝。检查rootfs/lib文件发现其下面没有交叉编译库的内容,而是一个软链接,指向一个不存在的路径。问题定位到了,修复如下:

    修改制作根文件系统镜像中sudo cp -P /usr/arm-linux-gnueabihf/lib/* rootfs/lib/sudo cp /usr/arm-linux-gnueabihf/lib/sf/* rootfs/lib/,重新制作根文件系统镜像后正常了。

    可能不同版本ubuntu安装的 gcc-arm-linux-gnueabi 库路径不同,需要自己检查一下。

    参考博客:启动报错:Kernel panic - not syncing: No working init found. Try passing init= option to kernel.

6.QEMU模拟的设备可以做什么?

摘抄自: Linux利器:QEMU!用它模拟开发板能替代真开发板?

QEMU 是一个模拟器,它和真正的开发板还是有一定的区别:

它无法完全模拟真实的硬件行为,也很难模拟一个 gpio 让你去拉高拉低或去点一个 led 灯,又或者去模拟 dram,一个 LCD 接口,让你去接一个显示屏….看起来它不能模拟的东西太多了,那它到底有什么用呢?

它的强项是模拟实现那些不涉及具体硬件外设的场景,比如:

你想快速体验一下最新的 u-boot 和 linux kernel,它拿过来就能跑。

你想在 Arm 上运行 Ubuntu、Debian 这些时髦的 Linux 发行版,用它就行。

你想研究u-boot 或者 linux kernel 的启动流程,它也很合适。我有时候在具体的开发板上移植 Linux 内核的时候,发现某个流程跑的很异常,我又不确定正常的流程是什么样的时候,我就直接拿 QEMU 来跑一下做对比。

你想了解文件系统的挂载过程,它很合适。

你想学习 Arm 汇编,完全可以在 QEMU 上跑,配合 GDB 就能单步调试啦。

你想学习 Linux 设备树,它可以拿来做实验….

再或者你想编译某个开源的项目在 Arm 开发板上运行,而交叉编译比较困难,就可以考虑直接在 QEMU 上运行一个 Arm Ubuntu 来编译,也许会简单很多。

假设你以前一直玩单片机、做硬件,也想体验下 Arm Linux 开发,用 QEMU 试试再适合不过了。用在对的场景,QEMU 就是一款召之即来的利器!

文章参考博客:

Linux设备驱动开发(一) 使用Qemu模拟ARM vexpress-a9开发板

一步步教你:如何用Qemu来模拟ARM系统

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值