我想在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处理器。