3

我正在使用嵌入式 ARM Linux 系统,偶尔(但并非总是)在访问虚拟地址 0x2b200000 的页面时,我的应用程序中会出现总线错误。根据编译器/链接器是否将代码或数据放在该地址,我要么在读取变量时遇到总线错误,要么在从该页面获取指令时得到总线错误。在总线错误之后,我 cat /proc/self/maps 并确认该页面确实被映射为在我的进程中有效的东西。

它似乎只是那一页。页面 0x2b201000 和 0x2b1ff000 总是可以的(显然,在完全不同的地方可能有另一个坏地址,我只是碰巧没有访问它)。

我意识到这里有一百万个未知数,但想知道是否有人能指出我的调查方向。系统有自定义驱动程序 .kos 使用保留或隐藏在内核其余部分的物理内存,但我不明白这如何影响虚拟地址。

任何有见地的掘金都非常感谢。

4

2 回答 2

2

感谢大家的帮助。我发现了这个问题——行为不端的驱动程序期望某些用户地址是 2MB 对齐的。因此,例如,如果有效的映射地址实际上是 0x2b3cc000,它将错误地对齐到 0x2b200000,并践踏我的应用程序!

于 2012-04-22T14:41:58.497 回答
0

根据您的系统,您可能具有相同的虚拟->物理映射。如果您有其他工作设备,我会尝试在其上运行。这样您就可以立即确定是软件问题还是硬件问题。

运行用户代码或驱动程序代码时是否发生总线错误?

你说错误并不总是发生。当它发生在一个特定的构建中时,它总是发生在那个构建中还是仍然是零星的?

于 2012-04-21T18:30:15.180 回答