【问题标题】:SIGSEGV si_trapno on ARMARM 上的 SIGSEGV si_trapno
【发布时间】:2011-12-27 20:26:50
【问题描述】:

我正在为 armhf Debian 上的 SIGSEGV 编写信号处理程序。看来siginfo_tsi_trapno 成员在ARM 上不可用(来自eglibc 的/usr/include/asm-generic/siginfo.h):

[...]
#ifdef __ARCH_SI_TRAPNO
                    int _trapno;    /* TRAP # which caused the signal */
#endif

我的问题是为什么?为什么这个宏没有为 ARM 定义? MMU 是不是太笨了,无法传递这种信息?

【问题讨论】:

  • 您到底想知道什么?请注意,与 x86 相比,si_addr 在 ARM 上的行为也有所不同,请参见例如stackoverflow.com/questions/5964642/… - 如果您的信号处理程序想要深入研究“原因”,您可能需要为您想要支持的每个硬件架构编写一个特定的。

标签: linux memory-management segmentation-fault arm signals


【解决方案1】:

不仅仅是 ARM。来自sigaction(2)

               int      si_trapno;   /* Trap number that caused
                                        hardware-generated signal
                                        (unused on most architectures) */

快速浏览内核源代码会发现它只存在于 Alpha、Sparc 和 Tile 上。 (您正在查看的标头来自 Linux 内核,/usr/include/asm/usr/include/asm-generic/usr/include/linux 上的所有文件也是如此。

所以,问题不在于为什么这个字段在 ARM 上不存在;问题是它为什么会存在于 ARM 上,因为如您所见,它的默认状态不存在。我猜想在 Alpha 和 Sparc 上添加它是为了与同一硬件上的旧 Unix 变体兼容;我不知道为什么 Tile 决定添加它。

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 2015-03-18
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2014-12-19
    • 2019-08-28
    相关资源
    最近更新 更多