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
,而不是相反)。尝试检查接下来的事情:
- QEMU 版本。我正在使用 2.12,您的代码有效。因此,如果您使用的是旧版本,也请尝试使用 2.12。
- 仿真机和cpu。不确定它是否会影响 CP 寄存器,但我使用的是未指定 CPU 的 "virt" 机器,您也可以尝试此配置。
- 如果这没有帮助,请查看下面关于我的配置的更多详细信息。
我的配置
我正在使用 运行 QEMU 的下一个命令:
$ 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-标签 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
我需要实现一个涉及读取 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-system-arm -kernel $zimage -initrd $rootfs \
-machine virt -nographic -m 512 \
--append "root=/dev/ram0 rw console=ttyAMA0,115200 mem=512M"
其中:
$zimage
是zImage
文件的路径(我的内核是 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