【发布时间】:2012-04-19 13:54:24
【问题描述】:
我正在使用嵌入式 ARM Linux 系统,当访问位于虚拟地址 0x2b200000 的页面时,偶尔(但并非总是)我的应用程序中会出现总线错误。根据编译器/链接器是否将代码或数据放在该地址,我要么在读取变量时出现总线错误,要么在从该页面获取指令时得到总线错误。在总线错误之后,我 cat /proc/self/maps 并确认该页面确实被映射为在我的进程中有效的东西。
它似乎只是那一页。页面 0x2b201000 和 0x2b1ff000 总是可以的(显然,在完全不同的地方可能有另一个坏地址,我只是碰巧没有访问它)。
我知道这里有一百万个未知数,但想知道是否有人可以指出我的调查方向。系统有自定义驱动程序 .kos 使用保留或隐藏在内核其余部分的物理内存,但我不明白这会如何影响虚拟地址。
非常感谢任何见解。
【问题讨论】:
-
您认为这是一个硬件错误吗?这是您看到的数据中止故障吗?如果在加载 linux 之前,如果您有引导加载程序,或者创建一个引导加载程序,您可以在其中读取该地址并查看是否存在总线故障。基本上将问题分成两半,是硬件还是软件(例如,它是 mmu 故障,因为该地址范围不在 mmu 表中)。
-
我假设故障发生在 Linux 启动并加载驱动程序后。因为它总是相同的虚拟地址(并且可能并不总是相同的底层物理页框)。你知道我可以在哪里为 MMU 添加调试吗?