web-dev-qa-db-ja.com

レジスタ%gsは何に使用されますか?

%gsレジスタについて私が知ることができたのは、32ビット以上のx86アーキテクチャではレジスタを無料で使用できるようだということだけです。 gs_changeは、システムコールの前に実行されているようです。 このレジスタがどのように使用されるかについてのドキュメントを誰かに教えてもらえますか? —カーネル/ユーザーモードスイッチに使用されるレジスタだと思います。

私の質問の背景は、カーネルスタックトレースと正確に何が起こったのかを理解しようとしているということです。

スタックトレースは、/proc/sys/kernel/hung_task_timeout_secsに到達したフラッシュプロセスから生成されました。

2
ikrabbe

そうみたいです %gsは、x86LinuxカーネルのGCC'cスタック保護機能用に予約されています CONFIG_CC_STACKPROTECTOR セットアップするために有効 スタックカナリアArch/x86/include/asm/stackportector.h で説明を見ることができます。

1
yaegashi

ここで説明されているように:

http://www.gossamer-threads.com/lists/linux/kernel/970025

そしてここ:

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

GSレジスタは、関連する論理アドレスコンポーネントを追加した後、アドレスのユーザーモードとカーネルモードの範囲を区別するために使用されます。

命令swappsは、GSレジスタをMSR値と交換するために使用され、特権モードでのみこれを実行できます。

たとえば、カーネルモードのメモリが使用されるように、スワップは常にIDTハンドラの開始時と開始後に実行する必要があります。

2
Peter Teoh