在 Linux 信号处理程序中,x86 扩展状态将始终采用 XSAVE 格式,还是也可以采用 XSAVEC 格式?

问题描述 投票:0回答:1

在 x86-64 上,当 Linux 用户模式程序崩溃时,但有一个用于该崩溃的信号处理程序,AVX 扩展状态是否始终以

XSAVE
格式保存到堆栈中,还是可以以
XSAVEC
("压缩”)格式也是如此?

我想知道这一点,以便我可以访问信号处理程序中保存的 AVX 上下文。

具体来说,

ucontext_t
成员
fpregs
指向包含
FXSAVE
浮点+SSE状态的结构。
_libc_fpstate
包含覆盖在
_fpx_sw_bytes
处的
&__glibc_reserved1[12]
。这包含一个神奇的值
FP_XSTATE_MAGIC1
标记 XSTATE(AVX 等)上下文存在。

但是,要到达包含例如的上下文部分

ymm
寄存器的高半部分,似乎您必须使用
CPUID
子函数
0x0D
来获取该特定 XSTATE 功能的偏移量。如果 Linux 内核使用
XSAVEC
而不是
XSAVE
来写入用户模式信号帧,则意味着确定偏移量的算法不同。

我是否需要支持

XSAVE
XSAVEC
格式才能在冻结上下文中查找 AVX 上下文?

linux exception signals x86-64 avx
1个回答
0
投票

在 Linux 信号处理程序中,使用的扩展状态格式取决于多种因素,例如处理器架构、内核版本以及内核代码中实现的特定优化。然而,当信号传递到用户模式进程时,Linux 内核通常使用 XSAVE 格式来保存扩展处理器状态,包括 AVX 寄存器。

XSAVE 指令通常用于将所有启用的处理器状态保存到其操作数指定的内存区域中。当处理器中启用 AVX 扩展时,这包括 AVX 寄存器。因此,大多数情况下,当信号发生时,内核会使用 XSAVE 指令保存处理器状态,并且信号处理程序可以通过 ucontext_t 结构访问这个保存的状态。

尽管如此,重要的是要认识到,行为可能会根据具体架构、内核版本以及随着时间的推移对内核代码所做的任何优化或更改等因素而有所不同。虽然 XSAVE 通常用于保存扩展处理器状态,但在某些情况下可能会使用 XSAVEC(压缩格式),特别是在必须最小化保存状态大小的情况下。

为了确保不同环境和配置之间的稳健性和兼容性,建议在信号处理程序中访问 AVX 上下文时支持 XSAVE 和 XSAVEC 格式。这种方法使您的代码能够有效地处理各种场景并保持与不同系统和设置的兼容性。

© www.soinside.com 2019 - 2024. All rights reserved.