【问题标题】:Weird lock up in the kernel内核中的奇怪锁定
【发布时间】:2012-07-31 21:22:52
【问题描述】:

基本上,我在将目标代码从 mach 目标文件加载和链接到 Linux 内核时搞砸了,当我从该对象内部执行 printk 时,我注意到了一些奇怪的事情。如果我使用超过 3 个(4 个或更多)参数 (printk("%d,%d,%d \n", 1, 1, 1)) 调用 printk,系统将锁定,但稍后会锁定(它不会从系统调用返回,而是锁定)。 实际打印工作并在所有情况下打印预期值。

现在,奇怪的是只有在我使用 Clang+LLVM 构建它时才会发生这种情况。这是罪魁祸首代码:

另一方面,当它使用 LLVM GCC 构建时,它工作得很好:

这也适用于使用 GNU GCC 构建时:

谁能说明为什么clang版本会导致系统锁定?所以基本上,第一个sn-p代码有问题导致系统锁定,而不是存在于其他人身上。我真的不知道怎么了。

【问题讨论】:

  • 可能在某处乱写一些重要的东西。具体在哪里,我不知道。是否有机会逐条说明?
  • 等等,你正在从 Mach 目标文件中加载代码?解释一下?
  • @duskwuff 长话短说,我写了一个链接器来链接和加载 mach 目标文件到 linux 内核。链接器不是问题,其他一切正常。
  • 哇。好。您确定您的 Mach 对象使用与 Linux 内核相同的调用约定吗?
  • @duskwuff 不完全确定。但我认为 EABI 和 Darwin ABI 非常相似。我对 EABI 做了些微改动,现在为了兼容性,大型类型以 4 字节对齐。

标签: linux gcc arm llvm clang


【解决方案1】:

我不知道您是如何生成目标文件的,但您似乎使用的是 Darwin ABI,它基本上是经过大量修改的 APCS(“旧”ARM ABI)。但是,对于 linux 等,您需要使用 EABI(又名 AAPCS),它在许多情况下与 APCS 不同。

例如,R9 在 EABI 中是调用保存的,但在 darwin 上是调用破坏的,在传递 64 位值等方面存在差异。请注意,您的 clang 示例破坏了 R9,而 llvm-gcc - 没有 :)

【讨论】:

  • 是的!这是r9 问题,因为陷阱处理程序不希望它被丢弃。在分支到处理程序代码之前,我确保它在堆栈上保存了 r9,从而解决了问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 2014-01-24
  • 1970-01-01
  • 2019-04-01
  • 2023-03-29
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多