我所能找到的关于 %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
和这里:
GS寄存器用于区分用户态和内核态的地址范围,添加相关逻辑地址成分后。
指令 swapgs 用于将 GS 寄存器与 MSR 值交换,并且只有在特权模式下才能完成此操作。
例如,必须始终在 IDT 处理程序启动期间及其之后完成 swapgs,以便使用内核模式内存。