QEMU是否模拟ARM协处理器

时间:2018-11-08 17:29:07

标签: linux-kernel arm embedded-linux qemu

我需要实现一个内核模块,其中涉及读取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?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

  1. QEMU版本。我正在使用2.12,并且您的代码有效。因此,如果您使用的是旧版本,也可以尝试使用2.12。
  2. 模拟机和cpu。不确定是否会影响CP寄存器,但是我使用的是未指定CPU的“虚拟”计算机,您也可以尝试这种配置。
  3. 如果这样做没有帮助,请在下面查看有关我的配置的更多详细信息。

我的配置

我正在使用下一条命令来运行QEMU:

asm volatile

其中:

  • $ qemu-system-arm -kernel $zimage -initrd $rootfs \ -machine virt -nographic -m 512 \ --append "root=/dev/ram0 rw console=ttyAMA0,115200 mem=512M" $zimage文件的路径(我的内核是标记为zImage的linux-mainline,是通过v4.18配置构建的)
  • multi_v7_defconfig是使用最少BusyBox rootfs的CPIO存档的路径

下一个是我的内核模块代码:

$rootfs

加载此模块后,我可以在#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