寄存器%gs有什么用?

寄存器%gs有什么用?

我所能找到的关于 %gs 寄存器的信息是,它似乎是一个在 >32 位 x86 架构上免费使用的寄存器。似乎 gs_change 在任何系统调用之前执行。 有人能告诉我这个寄存器是如何使用的文档吗?— 我假设它是用于内核/用户模式切换的寄存器。

我的问题的背景是,我试图了解内核堆栈跟踪以及到底发生了什么。

堆栈跟踪是从到达 的刷新过程生成的/proc/sys/kernel/hung_task_timeout_secs

答案1

它似乎%gs是为 x86 Linux 内核上的 GCC'c 堆栈保护功能保留的CONFIG_CC_STACKPROTECTOR启用以便设置堆栈金丝雀。您可以在以下位置查看一些解释拱门/x86/include/asm/stackportector.h

答案2

正如这里所解释的:

https://lists.archive.carbon60.com/linux/kernel/970025

和这里:

https://bromiumlabs.wordpress.com/2015/02/02/exploiting-badiret-vulnerability-cve-2014-9322-linux-kernel-privilege-escalation/

GS寄存器用于区分用户态和内核态的地址范围,添加相关逻辑地址成分后。

指令 swapgs 用于将 GS 寄存器与 MSR 值交换,并且只有在特权模式下才能完成此操作。

例如,必须始终在 IDT 处理程序启动期间及其之后完成 swapgs,以便使用内核模式内存。

相关内容