用QEMU模拟ARM开发板,搭建Linux kernel运行环境

前言

有的时候我们想调试linux kernel或者linux应用程序,但是又没有硬件环境,这个时候可以选择用模拟器的方法,模拟出一个硬件环境。

Android emulator

Android系统的模拟器叫Emulator,使用这个模拟器需要下载Android源代码,编译成功之后才能运行。由于编译Android源码还是需要一定的硬件配置,我尝试了没编译成功。

QEMU

QEMU是一个可以模拟ARM架构的开源软件,我们可以使用他来模拟vexpress-a9开发板,在上面搭建linux kernel运行环境。参考QEMU模拟vexpress-a9 搭建Linux kernel运行环境,成功的在ubuntu 16.04上模拟运行了linux kernel最小系统,这样就方便代码的调试学习了。

以下是kernel启动过程的打印:

neo@neo-virtual-machine:~/work/linux-4.14.7/arch/arm/boot/dts$ qemu-system-arm -M vexpress-a9 -m 512M -kernel ../zImage -dtb ./vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0 rw init=/linuxrc" -sd /home/neo/work/a9rootfs.ext3 
WARNING: Image format was not specified for '/home/neo/work/a9rootfs.ext3' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
Booting Linux on physical CPU 0x0
Linux version 4.14.7 (neo@neo-virtual-machine) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9)) #1 SMP Fri Jul 8 21:48:11 CST 2022
CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
OF: fdt: Machine model: V2P-CA9
Memory policy: Data cache writeback
CPU: All CPU(s) started in SVC mode.
percpu: Embedded 16 pages/cpu @9fbae000 s36428 r8192 d20916 u65536
Built 1 zonelists, mobility grouping on.  Total pages: 130048
Kernel command line: root=/dev/mmcblk0 console=ttyAMA0 rw init=/linuxrc
log_buf_len individual max cpu contribution: 4096 bytes
log_buf_len total cpu_extra contributions: 12288 bytes
log_buf_len min size: 16384 bytes
log_buf_len: 32768 bytes
early log buf free: 14976(91%)
PID hash table entries: 2048 (order: 1, 8192 bytes)
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Memory: 509556K/524288K available (6144K kernel code, 402K rwdata, 1364K rodata, 1024K init, 169K bss, 14732K reserved, 0K cma-reserved)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  
### 使用 QEMU 模拟 ARM 开发板 LCD 显示 为了实现通过 QEMU 模拟 ARM 开发板上的 LCD 显示功能,通常需要特定的硬件模型以及相应的内核参数设置来启用图形输出。下面提供一种基于 `virt` 平台的方法,该平台提供了较为通用的支持。 #### 启动带有LCD显示支持的ARM虚拟机实例 要使能LCD仿真,在启动QEMU时需指定合适的机器类型并加入 `-display` 参数用于控制显示器行为: ```bash qemu-system-arm \ -M virt,highmem=off,virtualization=true,gic-version=max \ -cpu cortex-a15 \ -m 1024 \ -kernel zImage \ -initrd initramfs.cpio.gz \ -dtb virt.dtb \ -append "root=/dev/vda console=ttyAMA0" \ -display gtk \ -nographic ``` 上述命令中的关键部分解释如下: - `-M virt,...`: 定义了所使用的机器型号为 `virt`[^1]。 - `-display gtk`: 此选项告知QEMU使用GTK工具包创建窗口以展示GUI界面;如果希望无头模式下操作,则可省略此条目或替换为其他形式如VNC等。 - `-nographic`: 虽然这里指定了图形前端,但是仍然保留了串口重定向以便于调试信息查看。 对于某些更具体的开发板(比如Raspberry Pi),可能还需要额外调整DTB文件以及其他初始化参数才能正确呈现屏幕内容。此外,确保选用的操作系统镜像本身也具备完整的framebuffer驱动程序支持是非常重要的。 #### 创建适用于LCD测试的根文件系统 当目标是验证LCD工作状态时,建议构建一个精简版Linux发行版作为guest OS,并安装必要的X Window System组件连同一些简单的绘图应用程序,例如xterm、xclock等。这有助于直观判断模拟环境下的显示屏是否正常运作。 #### 注意事项 由于不同版本间的差异性和各种因素的影响,实际应用过程中可能会遇到兼容性问题或其他挑战。因此,在尝试以上方案之前,请务必查阅最新的官方文档获取最权威指导,并考虑实验性质较强的特点适当备份数据以防意外发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值