Linux kernel QEMU是否模拟ARM协处理器

Linux kernel QEMU是否模拟ARM协处理器,linux-kernel,arm,embedded-linux,qemu,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", r

我需要实现一个涉及读取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,而不是相反。尝试检查以下事项:

QEMU版本。我使用的是2.12,你的代码可以正常工作。所以,如果您使用的是旧版本,也可以尝试2.12。 模拟机器和cpu。不确定它是否会影响CP寄存器,但我使用的是未指定CPU的virt机器,您也可以尝试此配置。 如果这没有帮助,请在下面查看有关我的配置的更多详细信息。 我的配置 我正在使用下一个命令运行QEMU:

$qemu系统arm-kernel$zimage-initrd$rootfs\ -机器虚拟-无图形-m 512\ -附加根=/dev/ram0 rw console=TTYAM0115200 mem=512M 其中:

$zimage是zimage文件的路径。我的内核是标签v4.18上的linux主线,使用multi_v7_defconfig配置构建 $rootfs是到CPIO归档的路径,具有最小的BusyBox rootfs 下面是我的内核模块代码:

包括 静态int\uu init mrc\u initvoid { u32 acr; /* *读取协处理器访问控制寄存器。 *详见Cortex-A9 TRM。 */ asm挥发性mrc p15,0,%0,c1,c0,2\n:=r acr; pr_infoACR=0x%x\n,acr; 返回0; } 静态无效uu退出mrc u退出球形 { } 模块_initmrc_init; 模块退出模块退出; 模块_AUTHORSam Protsenko; 模块描述测试QEMU上的MRC; 模块许可证GPL; 加载此模块后,我可以在dmesg中看到下一个输出:


此外,要检查特定CP寄存器的qemu实现状态,您需要为该寄存器名grep qemu源,这里定义了许多ARMCPRegInfo数据结构,还有一组要处理的逻辑,都是用C编写的。例如,要处理CPACR的读协处理器访问控制寄存器grep。
ACR = 0xf00000