gpt4 book ai didi

android - 在没有内存访问的线路上发出 SIGBUS 信号

转载 作者:行者123 更新时间:2023-11-30 02:28:45 24 4
gpt4 key购买 nike

我的 Android 应用程序在以下代码段的第 4 行报告 SIGBUS 错误(这是一个函数序言):

MOV R12, SP
STMFD SP!, {R4-R12,LR,PC}
SUB R11, R12, #4
SUB SP, SP, #0xA4 <- SIGBUS here
STR R0, [R11,#var_30]
MOV R2, #0
MOV R0, #0
STR R0, [R11,#var_70]
STR R0, [R11,#var_68]
STR R0, [R11,#var_60]
STR R0, [R11,#var_5C]

这可能吗?

最佳答案

假设您没有做任何事情,例如试图直接戳出 mmap 的硬件地址,从而导致异步外部中止的乐趣,这让我最怀疑堆栈预先恰好推送了两条指令(即 the uncorrected PC offset )。如果您以某种方式对 SP 胡说八道,例如通过先前弹出损坏的堆栈框架,情况可能会这样展开:

  • SP 中的无意义值不是 4 字节对齐的,因此由于架构不允许未对齐的加载/存储倍数,STM导致对齐错误(对齐错误的优先级高于任何其他 MMU 错误)。
  • 由于愚蠢的遗留原因* 内核 then tries to pretend不存在对齐错误这样的事情,并使用多个“安全”访问来模拟它。
  • 然后内核在尝试访问无意义地址的对齐处理程序中出现 MMU 故障。在那一点上,一切都沿着“完全放弃”的路径回到用户空间——你得到了原始对齐异常的 SIGBUS,但没有正确的报告(因为修复从未完成),并且可能与 ' secret' 内核端页面错误。最终结果:困惑。

要检查此事件过程,请先尝试执行 echo 5 > /proc/cpu/alignment (或程序等效)禁用修复并正确报告对齐错误 - 对于处理大多数未对齐访问的硬件,这确实应该是现代内核的默认设置,但遗憾的是它似乎仍然有太多问题依赖于这种缺陷的软件。

* 即网络层程序员过于依赖类型双关和结构打包的未定义行为,这些行为在 x86 上“有效”,而某些古老版本的 ARM GCC 显然很乐意生成未对齐的 LDM/STM,即使对于有效代码也是如此

关于android - 在没有内存访问的线路上发出 SIGBUS 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com