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