如何在ARM体系结构中读取协处理器

时间:2018-03-01 14:18:00

标签: c assembly arm

我正在尝试在以下片上系统中读取CP15协处理器

Cortex A7 - ARMv7-A

在我的代码段

下面
void main (void)
{
    unsigned int reg_value = 0;
    asm volatile("mrc p15, 0, %0, c0, c0, 0" : "=r"(reg_value) );
    printf("reg_value: %d", reg_value);
}

我不知道这是否是读取协处理器寄存器的正确方法,但其编译完成且没有错误。 问题出现在执行期间(代码在root中执行):

Illegal instruction

如果我使用gdb,我会得到以下结果:

   0x000086a0 <+16>:    str r3, [r11, #-40] ; 0x28
=> 0x000086a4 <+20>:    mrc 15, 0, r3, cr0, cr0, {0}
   0x000086a8 <+24>:    str r3, [r11, #-40] ; 0x28

为什么我无法读取协处理器寄存器?我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

您似乎正在尝试使用指令访问MIDR:主ID寄存器(来自ARMARMv7 B4.1.105)

MRC p15, 0, <Rt>, c0, c0, 0    ; Read MIDR into Rt

但是,当您在Linux中并执行应用程序时,您处于用户模式(PL0) 和ARMARMv7在MIDR的使用限制中指定

  

只能从PL1或更高版本访问。

所以只能在PL1,PL2,PL3上访问。要访问它,您需要创建一个运行在PL1的驱动程序,它将读取MIDR。然后,在您的应用程序中,打开此驱动程序以使用IOCTL获取数据。

您也可以尝试使用来自PL0的SVC调用来访问内核模式(PL1),但这意味着修改内核SVC处理程序。