QEMU 是否模拟 ARM 协处理器

Does QEMU emulate ARM coprocessor

我需要实现一个涉及读取 ARM Cortex-A9 协处理器寄存器的内核模块:

register int reg asm ("r6");
reg = -2;
volatile printk(KERN_INFO "reg: %d\n", reg);
volatile  asm("MRC p15, 0,r6, c1, c0, 2;"); //Read Coprocessor Access Control Register
volatile  printk(KERN_INFO "reg: %d\n", reg);

然而,当我在 QEMU 上 运行 这个时,它总是打印出:

reg: -2
reg: -2

这是我的代码还是QEMU的问题?

提前致谢。

您的代码应该可以正常工作(尽管您需要从 printk 行中删除 volatile,并且 ASM 命令应该是 asm volatile,而不是相反)。尝试检查接下来的事情:

  1. QEMU 版本。我正在使用 2.12,您的代码有效。因此,如果您使用的是旧版本,也请尝试使用 2.12。
  2. 仿真机和cpu。不确定它是否会影响 CP 寄存器,但我使用的是未指定 CPU 的 "virt" 机器,您也可以尝试此配置。
  3. 如果这没有帮助,请查看下面关于我的配置的更多详细信息。

我的配置

我正在使用 运行 QEMU 的下一个命令:

$ qemu-system-arm -kernel $zimage -initrd $rootfs \
    -machine virt -nographic -m 512 \
    --append "root=/dev/ram0 rw console=ttyAMA0,115200 mem=512M"

其中:

  • $zimagezImage 文件的路径(我的内核是 linux-标签 v4.18 上的主线,使用 multi_v7_defconfig 配置构建)
  • $rootfs 是具有最小 BusyBox rootfs
  • 的 CPIO 存档路径

我的内核模块代码如下:

#include <linux/module.h>

static int __init mrc_init(void)
{
    u32 acr;

    /*
     * Read Coprocessor Access Control Register.
     * See Cortex-A9 TRM for details.
     */
    asm volatile ("mrc p15, 0, %0, c1, c0, 2\n" : "=r" (acr));

    pr_info("ACR = 0x%x\n", acr);

    return 0;
}

static void __exit mrc_exit(void)
{
}

module_init(mrc_init);
module_exit(mrc_exit);

MODULE_AUTHOR("Sam Protsenko");
MODULE_DESCRIPTION("Test MRC on QEMU");
MODULE_LICENSE("GPL");

加载此模块后,我可以在 dmesg 中看到下一个输出:

ACR = 0xf00000