【发布时间】:2023-03-31 12:45:02
【问题描述】:
在设备驱动程序中,我想读取 ttbr0_el1 寄存器(EL1 的转换表基址寄存器)指向的第一个数据,如下所示。但是引用指针会导致陷阱(数据访问中止)。怎么了?
static inline uint64_t system_read_TTBR0_EL1(void)
{
uint64_t val;
asm volatile("mrs %0, ttbr0_el1" : "=r" (val));
return val;
}
static inline uint64_t system_read_TTBR1_EL1(void)
{
uint64_t val;
asm volatile("mrs %0, ttbr1_el1" : "=r" (val));
return val;
}
ttbr0_el1 = system_read_TTBR0_EL1();
ttbr1_el1 = system_read_TTBR1_EL1();
printk("ttbr0 = %llx\n", ttbr0_el1);
printk("ttbr1 = %llx\n", ttbr1_el1);
printk("*ttbr1 = %llx\n", *(uint64_t *)ttbr1_el1);
printk("*ttbr0 = %llx\n", *(uint64_t *)ttbr0_el1);
输出
[100450.356279] ttbr0 = 27f0000042dd7001
[100450.356595] ttbr1 = 27f00000414ab001
[100450.357015] Unable to handle kernel paging request at virtual address 27f00000414ab001
[100450.357564] Mem abort info:
[100450.357803] ESR = 0x96000004
[100450.358116] EC = 0x25: DABT (current EL), IL = 32 bits
[100450.358535] SET = 0, FnV = 0
[100450.359256] EA = 0, S1PTW = 0
[100450.359537] Data abort info:
[100450.359785] ISV = 0, ISS = 0x00000004
[100450.360101] CM = 0, WnR = 0
[100450.360449] [27f00000414ab001] address between user and kernel address ranges
[100450.360986] Internal error: Oops: 96000004 [#22] SMP
【问题讨论】:
-
只有该寄存器的低 48 位保存基地址。有关详细信息,请参阅 ARM 架构参考手册。
标签: assembly gcc linux-device-driver arm64