我需要实现一个内核模块,其中涉及读取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?
谢谢。
答案 0 :(得分:1)
您的代码应该可以正常工作(尽管您需要从distance
行中删除volatile
,并且ASM命令应该为printk
,而不是相反)。尝试检查接下来的事情:
我正在使用下一条命令来运行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