我在嵌入式 ARM Linux 系统上工作,偶尔(但不总是)当访问虚拟地址 0x2b200000 的页面时,我的应用程序会出现总线错误。根据编译器/链接器是将代码还是数据放在该地址,我要么在读取变量时遇到总线错误,要么在从该页面获取指令时遇到总线错误。在出现总线错误后,我 cat/proc/self/maps 并确认该页面确实已映射到我的进程中有效的内容。
它似乎只是那一页。页面 0x2b201000 和 0x2b1ff000 总是正常的(很明显,在完全不同的地方可能有另一个错误的地址,我只是碰巧没有访问它)。
我知道这里有一百万个未知数,但想知道是否有人可以指出我的调查方向。系统有自定义驱动程序 .kos,它使用保留或隐藏在内核其余部分中的物理内存,但我不明白这对虚拟地址有何影响。
非常感谢任何宝贵的见解。
最佳答案
感谢大家的帮助。我发现了问题 - 行为不端的驱动程序期望某些用户地址是 2MB 对齐的。例如,如果有效的映射地址实际上是 0x2b3cc000,它将错误地对齐到 0x2b200000,并践踏我的应用程序!
关于linux - ARM Linux : bus error on one particular page of valid virtual memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229600/