Linux-Kernel

寄存器 %gs 是做什麼用的?

  • November 29, 2020

我所能找到的關於 %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

和這裡:

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

GS寄存器用於區分使用者模式和核心模式的地址範圍,添加相關的邏輯地址組件後。

指令 swapgs 用於將 GS 寄存器與 MSR 值交換,並且只有在特權模式下才能這樣做。

例如,必須始終在 IDT 處理程序啟動期間和之後完成交換,以便使用核心模式記憶體。

引用自:https://unix.stackexchange.com/questions/209968