%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を実行する必要があります。