3.5启动QEMUARM64虚拟机

3.5 启动QEMU ARM64虚拟机

3.5.1 启动QEMU ARM64虚拟机

这条命令启动了一个基于 ARM 架构的虚拟机,配置了 4 GB 内存、4 个 CPU 核心、一个 VirtIO 硬盘和一个 VirtIO 网络设备,并指定了启动内核和根文件系统。通过 -nographic 和端口转发,可以在终端中直接操作虚拟机,并通过 SSH 访问虚拟机。

bash 复制代码
qemu-system-aarch64 \
-m 4096 \
-cpu cortex-a72 \
-M virt,gic-version=3 \
-smp 4 \
-kernel linux-build/arch/arm64/boot/Image.gz \
-append "noinitrd sched_debug console=ttyAMA0 root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8 nokaslr" \
-drive if=none,format=raw,file=rootfs/linuxroot.img,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-netdev user,id=eth0,hostfwd=tcp::56789-:22 -device virtio-net-device,netdev=eth0 \
-nographic

正常情况下,你会见到如下登录界面。

bash 复制代码
Ubuntu 22.04.5 LTS xeno-demo ttyAMA0

xeno-demo login: 

以下是对该 qemu-system-aarch64 命令的逐行解释:

1. qemu-system-aarch64

这是 QEMU 的命令,用于启动一个基于 ARM 架构(64 位)的虚拟机。aarch64 表示使用 ARMv8-A 64 位架构。

2. -m 4096

指定虚拟机的内存大小为 4096 MB(即 4 GB)。
-m 参数控制分配给虚拟机的 RAM 大小。

3. -cpu cortex-a72

指定虚拟机使用的 CPU 模型为 Cortex-A72。

Cortex-A72 是 ARM 的一款高性能处理器核心。

4. -M virt,gic-version=3

指定虚拟机的机器类型为 virt,这是 QEMU 提供的一种通用的虚拟化平台,用于模拟 ARM 系统。
gic-version=3 表示使用 Generic Interrupt Controller (GIC) 版本 3,这是一种中断控制器标准,用于管理 ARM 系统中的中断。

5. -smp 4

指定虚拟机的 CPU 核心数量为 4。
-smp 参数用于设置虚拟机的对称多处理(SMP)配置,这里表示虚拟机有 4 个虚拟 CPU 核心。

6. -kernel linux-build/arch/arm64/boot/Image.gz

指定虚拟机启动时使用的内核镜像文件路径。
Image.gz 是一个压缩的 Linux 内核镜像,位于 linux-build/arch/arm64/boot/ 目录下。

7. -append "noinitrd sched_debug console=ttyAMA0 root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8 nokaslr"

向内核传递启动参数:

  • noinitrd: 不使用 initrd(初始 RAM 磁盘)。
  • sched_debug: 启用调度器调试信息。
  • console=ttyAMA0: 将控制台输出重定向到 ttyAMA0(虚拟串口)。
  • root=/dev/vda: 指定根文件系统所在的设备为 /dev/vda
  • rootfstype=ext4: 指定根文件系统的类型为 ext4。
  • rw: 以读写模式挂载根文件系统。
  • crashkernel=256M: 预留 256 MB 内存用于崩溃转储(kdump)。
  • loglevel=8: 设置内核日志级别为 8(最高级别,显示所有日志信息)。
  • nokaslr: 禁用内核地址空间布局随机化(KASLR),主要用于调试。
8. -drive if=none,format=raw,file=rootfs/linuxroot.img,id=hd0

定义一个块设备(硬盘):

  • if=none: 表示不直接连接到任何接口,而是通过后续的 -device 参数进行绑定。
  • format=raw: 指定磁盘镜像格式为原始格式(raw)。
  • file=rootfs/linuxroot.img: 指定磁盘镜像文件路径。
  • id=hd0: 为该驱动器分配一个标识符 hd0,用于后续引用。
9. -device virtio-blk-device,drive=hd0

将前面定义的块设备 hd0 连接到虚拟机,并使用 VirtIO 半虚拟化驱动程序。

VirtIO 是一种高效的 I/O 虚拟化技术,能够显著提高性能。

10. -netdev user,id=eth0,hostfwd=tcp::56789-:22

定义一个用户模式网络设备:

  • id=eth0: 为该网络设备分配标识符 eth0
  • hostfwd=tcp::56789-:22: 设置端口转发规则,将主机的 56789 端口映射到虚拟机的 22 端口即SSH服务端口。这允许通过主机访问虚拟机的 SSH 服务ssh -p 56789 localhost
11. -device virtio-net-device,netdev=eth0

将前面定义的网络设备 eth0 连接到虚拟机,并使用 VirtIO 网络驱动程序。

12. -nographic

禁用图形界面输出,并将虚拟机的串口输出直接显示在终端上。

3.5.2 检查Cobalt内核

为了测试 Xenomai Cobalt内核是否正常启动,检查内核启动日志中的消息:

bash 复制代码
root@xeno-demo:~# dmesg | grep -i xenomai
[    0.502146] [Xenomai] scheduling class idle registered.
[    0.502310] [Xenomai] scheduling class rt registered.
[    0.502880] IRQ pipeline: high-priority Xenomai stage added.
[    0.511492] [Xenomai] Cobalt v3.2.4

上述命令通过 dmesg 查看内核启动日志,并使用 grep 筛选出与 Xenomai 相关的消息,用于验证 Cobalt 内核是否正常启动。日志中显示了 Xenomai 的关键初始化信息,例如调度类(idle 和 rt)的注册以及 Cobalt 版本号(v3.2.4)。这些消息表明 Xenomai 实时子系统已成功加载并运行。如果未出现相关日志或存在错误信息,则可能意味着内核模块未正确加载或配置存在问题,需进一步排查安装和引导过程。

Xenomai Cobalt 内核正常启动后,会在 /proc/xenomai 目录下生成多个文件,用于提供运行时信息和调试支持。

bash 复制代码
root@xeno-demo:~# cat /proc/xenomai/version
3.2.4

root@xeno-demo:~# cat /proc/xenomai/sched/stat
CPU  PID    MSW        CSW        XSC        PF    STAT       %CPU  NAME
  0  0      0          0          0          0     00018000  100.0  [ROOT/0]
  1  0      0          0          0          0     00018000  100.0  [ROOT/1]
  2  0      0          0          0          0     00018000  100.0  [ROOT/2]
  3  0      0          0          0          0     00018000  100.0  [ROOT/3]

/proc/xenomai/version 显示当前 Xenomai 的版本号(如 3.2.4),用于确认安装的版本是否正确。而 /proc/xenomai/sched/stat 提供了实时调度器的统计信息,包括每个 CPU 核心的任务模式切换次数(MSW)、上下文切换次数(CSW)、异常切换次数(XSC)、PF(缺页异常)以及STAT(任务状态)等。这些数据有助于监控系统实时性能和排查潜在问题,是调试和优化实时应用的重要工具。

为什么这里CPU的占用率是100%?这里 ROOT/x 是内核 idle 线程,在没有 Xenomai 实时线程运行的情况下,idle线程会占完整个CPU,这里的100%不代表整个系统都被跑满,旨在说明在没有用户态实时线程时,CPU都消耗在内核idle线程。等到有其他线程运行时,CPU会分配过去,也会看到非PID=0、非ROOT/x的线程在运行。

Xenomai Cobalt 内核的启动参数可以通过 /sys/module/xenomai/parameters/ 目录查看,这些参数在内核模块加载时被初始化,用于配置 Xenomai 的运行行为。

bash 复制代码
root@xeno-demo:~# ls /sys/module/xenomai/parameters/
allowed_group  state  supported_cpus  sysheap_size

root@xeno-demo:~# cat /sys/module/xenomai/parameters/sysheap_size
4096

例如,sysheap_size 表示系统堆的大小(以 KB 为单位),这里显示为 4096 KB,即 4 MB,用于分配实时任务的内存资源。其他参数如 allowed_group 控制访问权限,supported_cpus 定义支持的 CPU 掩码,state 显示模块状态。这些参数为管理员提供了灵活的配置选项,便于优化和调试实时系统性能。

3.5.3 检查Xenomai用户层库和工具

执行 Xenomai 的 latency 工具可以验证其实时性能和相关库是否正确安装。latency 是 Xenomai 提供的一个基准测试工具,用于测量系统的实时延迟特性。运行该工具时,它会定期触发定时器中断,并记录系统响应的最大、最小和平均延迟。通过观察输出结果,可以判断 Xenomai 内核和用户空间库是否正常工作。如果工具能够成功运行并输出延迟数据,说明 Xenomai 环境已正确配置。

因为当前是在QMEU ARM64虚拟机下运行,具体的延迟数值可以忽略。在真实的硬件下测试,得到的延迟数值才有参考价值。

bash 复制代码
root@xeno-demo:~# latency
== Sampling period: 1000 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up...
RTT|  00:00:01  (periodic user-mode task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|    132.110|    495.434|   1184.420|       2|     0|    132.110|   1184.420
RTD|    133.921|    503.454|   1131.748|       7|     0|    132.110|   1184.420
RTD|     70.308|    538.631|   1391.883|      16|     0|     70.308|   1391.883
RTD|    167.898|    494.612|   1416.772|      21|     0|     70.308|   1416.772
RTD|    122.023|    498.749|   1110.043|      28|     0|     70.308|   1416.772
RTD|     73.017|    483.336|   1479.383|      32|     0|     70.308|   1479.383
相关推荐
切糕师学AI2 天前
NuttX RTOS是什么?
嵌入式·rtos
aspirestro三水哥3 天前
6.4非POSIXskin进程间通信
rtos·xenomai
aspirestro三水哥4 天前
6.2POSIX线程间通信
rtos·xenomai
鸿蒙小白龙6 天前
OpenHarmony轻量系统(Hi3861)RTOS API开发详解
openharmony·rtos·liteos·轻量系统
无聊到发博客的菜鸟14 天前
STM32 手册寄存器属性
stm32·单片机·嵌入式·rtos·寄存器
aspirestro三水哥14 天前
5.3RTDM用户层驱动
rtos·xenomai
无聊到发博客的菜鸟15 天前
STM32 RTC时钟不准的问题
stm32·嵌入式·rtc·rtos
aspirestro三水哥17 天前
4.7POSIX进程与线程实例
rtos·xenomai
无聊到发博客的菜鸟17 天前
使用STM32对SD卡进行性能测试
stm32·单片机·rtos·sd卡·fatfs
切糕师学AI20 天前
Azure RTOS ThreadX 简介
microsoft·嵌入式·azure·rtos