【问题标题】:ARM Linux: bus error on one particular page of valid virtual memoryARM Linux:有效虚拟内存的特定页面上的总线错误
【发布时间】:2012-04-19 13:54:24
【问题描述】:

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

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

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

非常感谢任何见解。

【问题讨论】:

  • 您认为这是一个硬件错误吗?这是您看到的数据中止故障吗?如果在加载 linux 之前,如果您有引导加载程序,或者创建一个引导加载程序,您可以在其中读取该地址并查看是否存在总线故障。基本上将问题分成两半,是硬件还是软件(例如,它是 mmu 故障,因为该地址范围不在 mmu 表中)。
  • 我假设故障发生在 Linux 启动并加载驱动程序后。因为它总是相同的虚拟地址(并且可能并不总是相同的底层物理页框)。你知道我可以在哪里为 MMU 添加调试吗?

标签: linux embedded arm sigbus


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    运行用户代码或驱动代码时是否会出现总线错误?

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

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 2023-03-31
      • 2012-05-14
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多