为什么读取CP15 c1控制寄存器失败(ARMv7内联asm)?

时间:2015-01-17 19:56:17

标签: c assembly arm

我想在ARMv7芯片上禁用MMU,d-cache和i-cache(见下文)以强制读取和写入内存,以微观基准测试内存功耗。 MWE:

#include <stdlib.h>
#include <stdio.h>

#define DEBUG

int main(int argc, char const *argv[])
{
#ifdef DEBUG
        printf("cp0\n");
#endif // DEBUG

        // disable MMU
        asm("mrc p15, 0, r1, c1, c0, 0"); // read
        asm("bic r1, r1, #0x1");          // MMU bit
        asm("mcr p15, 0, r1, c1, c0, 0"); // write

#ifdef DEBUG
        printf("cp1\n");
#endif // DEBUG

        // disable caches
        asm("mrc p15, 0, r1, c1, c0, 0");
        asm("bic r1, r1, #(0x1 << 12)");  // i-cache bit
        asm("bic r1, r1, #(0x1 << 2)");   // d-cache bit
        asm("mcr p15, 0, r1, c1, c0, 0");

#ifdef DEBUG
        printf("cp2\n");
#endif // DEBUG

        return 0;
}

但是,执行上面的代码会显示:

$ gcc -O0 -o mem_test mem_test.c
$ sudo ./mem_test
cp0

因此,可执行文件在第一个块(禁用MMU )期间静默退出,更具体地说是读取指令mrc p15, 0, r1, c1, c0, 0。我做错了什么?

我使用的硬件是ODROID-XU3,它有一个带有ARMv7指令集的三星Exynos 5422处理器。

0 个答案:

没有答案