カーネルコードがレッドゾーンを使用できないのはなぜですか?質問する

カーネルコードがレッドゾーンを使用できないのはなぜですか?質問する

64 ビット カーネル (x86_64 プラットフォーム用) を作成するときは、ユーザー空間 ABI が使用する 128 バイトのレッド ゾーンを使用しないようにコンパイラーに指示することを強くお勧めします (GCC の場合、コンパイラー フラグは です-mno-red-zone)。

有効にするとカーネルは割り込みに対して安全ではなくなります。

しかし、それはなぜでしょうか?

ベストアンサー1

カーネルタイプのコンテキストでレッドゾーンを使用できます。IDTentry は、スタック インデックス (ist) を 0..7 に指定できます (0 は少し特殊です)。TSS には、これらのスタックのテーブルが含まれています。1..7 はロードされ、例外/割り込みによって保存された初期レジスタに使用され、ネストされません。さまざまな例外エントリを優先度で分割し (たとえば、NMI は最も高く、いつでも発生する可能性があります)、これらのスタックをトランポリンとして扱うと、カーネルタイプのコンテキストでレッドゾーンを安全に処理できます。つまり、割り込みまたは例外を引き起こす可能性のあるコードを有効にする前に、保存されたスタック ポインタから 128 を減算して、使用可能なカーネル スタックを取得できます。

ゼロ インデックス スタックは、より従来的な方法で動作し、特権の遷移がない場合に、スタック、フラグ、PC、エラーを既存のスタックにプッシュします。

トランポリン内のコードは、マシン状態をサニタイズする間は他の例外を生成しないように注意する必要があります (当然、これはカーネルです)。ただし、異常なカーネル ネスト、スタック破損などを検出するための適切で安全な場所を提供します... [返信が遅くなり申し訳ありません。他のものを検索しているときにこれに気付きました]。

おすすめ記事