【问题标题】:Does QEMU emulate ARM coprocessorQEMU 是否模拟 ARM 协处理器
【发布时间】:2019-04-12 06:45:49
【问题描述】:

我需要实现一个涉及读取 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?

提前致谢。

【问题讨论】:

  • 还要检查特定CP寄存器的qemu实现状态,你需要grep qemu源以获得该寄存器名称,这里定义了许多ARMCPRegInfo数据结构,还有一堆逻辑可以使用,全部用 C 编写。因此,例如,处理“CPACR”的“读取协处理器访问控制寄存器”grep。

标签: linux-kernel arm embedded-linux qemu


【解决方案1】:

您的代码应该可以正常工作(尽管您需要从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 文件的路径(我的内核是标签v4.18 上的linux-mainline,使用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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2015-05-18
    • 2022-09-24
    • 2022-01-15
    • 2013-08-11
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多