use*_*822 4 android arm memory-management linux-kernel
我有一个Android设备 - 三星galaxy s2内核版本2.6.35.14(arm cortex a9)
我试图找到异常向量表的物理地址.我知道它在0xffff0000虚拟地址.(我可以通过内核模块打印它的值)
我也知道大多数内核虚拟地址(到物理)的转换是由值0x8000000的子站完成的.
我有一个设备可以直接从设备内存中读取数据,我想获得异常向量表.
当我构建一个内核模块并尝试使用宏virt_to_phys(0xffff0000)我有一些地址,但表不在那里.我成功找到了系统调用表,但这里宏给了我错误的地址.
有谁知道为什么会这样?异常向量表的地址是否位于特殊的物理地址中?内核是否以某种特殊方式转换其地址?
谢谢!!
该异常向量表一直在Linux中相当稳定,从2.6.35到最近的主线.它在引导阶段很早就分配,并涉及memblock引导分配器.涉及的文件是内核目录中的entry-armv.S,traps.c和vmlinux.lds.S(链接描述文件),其中包含mm(或内存管理ARM目录)中的init.c和mmu.c.此外,向量表必须始终映射,并且可由用户进程读取.这由内核用户帮助程序使用; 辅助例程也映射到此页面.
来自vmlinux.lds.S,
向量和存根是可重定位的代码,唯一重要的是它们的相对偏移量
__vectors_start表示向量页面中的代码,可在entry-armv.S中找到.但是,该函数在traps.c中重定位.所述引导分配器保留用于虚拟0xffff000地址的页面(如果配置了高矢量).在2.6.35内核中,memblock分配器在init.c中使用.这里mmu.c devicemaps_init()通过调用分配页面early_alloc().此页面不遵循正常的内核地址空间规则,并且virt_to_phys可能不会用作强制虚拟地址.
但是,原始memblock_alloc()返回地址确实存在内核地址.这是指针vector中devicemaps_init(); 这个地址确实适用于virt_to_phys和phys_to_virt.
可以很容易地找到entry-armv.S中的物理地址__vectors_start等,并计算物理地址; 但是,它会在初始阶段结束时被丢弃,我认为你对此并不感兴趣.
您可以调用,memblock_dump_all(void)查看dmesg并使用这些指针来尝试找到该vector页面.它将是4k大小.您可以更改devicemaps_init()以导出vector值.使用未修改内核的唯一方法是遍历ARM mmu表; 那是另一个故事.
| 归档时间: |
|
| 查看次数: |
2863 次 |
| 最近记录: |