2012-04-19 81 views
3

我工作的ARM嵌入式Linux系统上,偶尔的一个特定页面上总线错误(但不总是)我得到了我的应用程序总线错误时,在虚拟地址0x2b200000的页面访问。根据编译器/链接器是将代码还是数据放在该地址,我在读取变量时或在从该页面获取指令时遇到总线错误。公交车出错后,我/ cat/proc/self/maps并确认该页面确实已映射为我的进程中有效的内容。ARM Linux系统:有效的虚拟内存

它只是似乎是一个页面。页面0x2b201000和0x2b1ff000总是可以的(很明显,可能会有另一个地址完全不同的错误地址,我只是没有碰到任何东西)。

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

任何有识之士非常感谢。

+0

你是否认为这是一个硬件错误,这是你看到的数据中止错误?如果在加载linux之前,如果你有一个引导加载程序,或者创建一个引导加载程序,你可以在那里读取该地址并查看是否存在总线故障。基本上把问题分成一半,是硬件还是软件(例如,因为该地址范围不在mmu表中,它是mmu故障)。 – 2012-04-19 14:19:16

+0

我假设一旦启动Linux并加载驱动程序,就会发生故障。由于它始终是相同的虚拟地址(并且可能不总是相同的底层物理页框)。你知道我可以在哪里为MMU添加调试吗? – gimmeamilk 2012-04-19 14:31:59

回答

2

感谢您的帮助。我发现这个问题 - 表现糟糕的驱动程序期望某些用户地址为2MB对齐。所以,例如,如果有效的映射地址实际上是0x2b3cc000,它将不正确地对齐到0x2b200000,并践踏我的应用程序!

0

根据您的系统可能具有相同的virtual->物理映射。如果你有另一个工作设备,我会试着在那上面运行。这样,您可以立即确定它是软件还是硬件问题。

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

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