Linux-Kernel
寄存器 %gs 是做什麼用的?
我所能找到的關於 %gs 寄存器的所有資訊是,它似乎是一個在 >32 位 x86 架構上免費使用的寄存器。似乎 gs_change 在任何系統呼叫之前執行。 有人可以指出我如何使用該寄存器的文件嗎?— 我假設它是一個用於核心/使用者模式切換的寄存器。
我的問題的背景是,我試圖了解核心堆棧跟踪以及到底發生了什麼。
堆棧跟踪是從到達
/proc/sys/kernel/hung_task_timeout_secs
.
它似乎
%gs
是為 x86 Linux 核心上的 GCC’c 堆棧保護功能保留的,並CONFIG_CC_STACKPROTECTOR
啟用以設置堆棧金絲雀。你可以在arch/x86/include/asm/stackportector.h看到一些解釋。
如此處所述:
https://lists.archive.carbon60.com/linux/kernel/970025
和這裡:
GS寄存器用於區分使用者模式和核心模式的地址範圍,添加相關的邏輯地址組件後。
指令 swapgs 用於將 GS 寄存器與 MSR 值交換,並且只有在特權模式下才能這樣做。
例如,必須始終在 IDT 處理程序啟動期間和之後完成交換,以便使用核心模式記憶體。