我正在使用嵌入式ARM Linux系统,偶尔(但并非总是),当访问虚拟地址0x2b200000的页面时,我的应用程序中出现了总线错误。根据编译器/链接器是将代码还是数据放在该地址,我在读取变量时或者从该页面获取指令时会遇到总线错误。在总线错误之后我cat / proc / self / maps并确认页面确实已映射为我的进程中有效的内容。
它似乎只是一页。页面0x2b201000和0x2b1ff000总是可以的(显然可能有另一个不同的地址在某处完全不同,我只是碰巧没有访问它)。
我意识到这里有一百万个未知数,但是想知道是否有人能指出我在调查的某个方向。系统具有自定义驱动程序.kos,它使用内核其余部分保留或隐藏的物理内存,但我不知道这会如何影响虚拟地址。
任何洞察力都非常感激。
答案 0 :(得分:2)
感谢大家的帮助。我发现了问题 - 行为不端的驱动程序期望某些用户地址与2MB对齐。因此,例如,如果有效的映射地址实际上是0x2b3cc000,它将错误地与0x2b200000对齐,并践踏我的应用程序!
答案 1 :(得分:0)
根据您的系统,您可能拥有相同的虚拟>物理映射。如果你有另一个工作设备,我会尝试运行它。这样您就可以立即确定它是软件还是硬件问题。
运行用户代码或驱动程序代码时是否发生总线错误?
您说错误并不总是发生。当它与特定构建一起发生时,它是否总是在该构建中发生,还是仍然是零星的?