我有一台安卓设备 - 三星Galaxy S2,内核版本为2.6.35.14(ARM Cortex A9)
我尝试查找异常向量表的物理地址。我知道它在0xffff0000虚拟地址处(我可以通过内核模块打印它的值)。
我还知道大多数内核虚拟地址(到物理地址的转换)是通过减去0x8000000的值完成的。
我有一个可以直接从设备存储器中读取数据的设备,我想获取异常向量表。
当我构建内核模块并尝试使用virt_to_phys(0xffff0000)宏时,我得到了一些地址,但表格不在那里。我成功地以这种方式找到了系统调用表,但这里宏给我错的地址。
是否有人知道为什么会发生这种情况?异常向量表的地址是否驻留在特殊的物理地址中?内核是否以某种特殊的方式转换其地址?
谢谢!
devicemaps_init
中的vector
指针是 0xffff0000 的虚拟别名,它映射到相同的物理页面。这种 别名 的原因应该很明显。大多数 ARM CPU 需要将向量放在 0 或 0xffff0000,尽管较新的 ARM 可以省略此步骤。 - artless noisememblock_alloc()
分配一个正常的物理/虚拟对。然后在devicemaps_init()
中,创建第二个别名指向 0xffff0000。第一个虚拟地址是相关的并保持活动状态;它是devicemaps_init()
中vector
指针的值。它仍然存在于 MMU 表中;MMU 表是一个虚拟到物理的列表;因此两个条目指向相同的物理页面。正如您所观察到的,0xffff0000 不遵循正常规则。 - artless noise