Linux で、カーネル ソースを process.c で変更して、より多くのエントロピーを持つスタック アドレスを作成しようとしました (特に次の行)。
sp -= get_random_int() % 8192;
これを変更しすぎると、カーネルが停止するか、未定義のように見える動作が発生します。これにより PAGE_ALIGN() が何らかの形で失敗すると思いますか? 特に PAGE_ALIGN() が失敗する理由や、失敗するカーネル内のコードの正確な部分にはあまり興味がありません (ただし、それも知っておくとよいでしょう)。スタックが特定の地域に存在しなければならない理由にもっと興味があります。この背後にあるアーキテクチャ上の理由と動機は何ですか? これは、GDT/LDT がプロテクト モードでどのように動作するかに関係がありますか?
私が求めていることを明確にするために:
スタックの形式が 0xbfXXXXXX (32 ビット) でなければならないのはなぜですか? スタックを 0xaaXXXXXX やその他の値にすることができないのはなぜですか?