%gsレジスタについて私が知ることができたのは、32ビット以上のx86アーキテクチャではレジスタを無料で使用できるようだということだけです。 gs_changeは、システムコールの前に実行されているようです。 このレジスタがどのように使用されるかについてのドキュメントを誰かに教えてもらえますか? —カーネル/ユーザーモードスイッチに使用されるレジスタだと思います。
私の質問の背景は、カーネルスタックトレースと正確に何が起こったのかを理解しようとしているということです。
スタックトレースは、/proc/sys/kernel/hung_task_timeout_secs
に到達したフラッシュプロセスから生成されました。
そうみたいです %gs
は、x86LinuxカーネルのGCC'cスタック保護機能用に予約されています CONFIG_CC_STACKPROTECTOR
セットアップするために有効 スタックカナリア 。 Arch/x86/include/asm/stackportector.h で説明を見ることができます。
ここで説明されているように:
http://www.gossamer-threads.com/lists/linux/kernel/970025
そしてここ:
GSレジスタは、関連する論理アドレスコンポーネントを追加した後、アドレスのユーザーモードとカーネルモードの範囲を区別するために使用されます。
命令swappsは、GSレジスタをMSR値と交換するために使用され、特権モードでのみこれを実行できます。
たとえば、カーネルモードのメモリが使用されるように、スワップは常にIDTハンドラの開始時と開始後に実行する必要があります。