カーネルを初期化するとき、発生する必要があることがいくつかあります。1)ページングを有効にする必要があります。2)物理メモリマネージャーはgrubからメモリマップを解析する必要があります。3)さまざまな起動コードは必要なデータにアクセスする必要があります。後で使用するためにそこにとどまる(たとえば、GDT、IDT、メモリ管理構造)。
これらのステップ間の依存関係は私を夢中にさせています。上半分では、カーネルはその仮想アドレスでリンクされているため、私が思いついたオプションは次のとおりです。1)アセンブリでページングを有効にします。これには、(アセンブリ内の)すべてのマルチブートポインターをたどって、引き続きアクセスできるようにする必要があります。物理メモリマネージャに接続し、後でそれらすべてのマッピングを解除します。2)起動コードをその物理アドレスにリンクし、ポインタ操作を行って物理アドレスのカーネル構造にもアクセスします。または3)上位半分を使用しないでください。カーネル。
また、コンパイル時に物理メモリの量を知らなくても、物理メモリマネージャをブートストラップすることも含まれます。最初の構造を割り当てるときにすべてのマルチブート構造を慎重に回避するか、最初にすべてを使用してからそれらを上書きすることを心配しないでください(ただし、モジュールとこのアプローチを処理する必要があります)マルチブートテーブルを、物理メモリマネージャーのセットアップ中に必要な既知の場所にコピーする必要があります)。
これらの問題が、私がこれまで上位半分のカーネルを避けてきた理由です。これらの依存関係を解決するための優れたシステムを持っている人はいますか?リンク/仮想アドレスのカーネルと物理アドレスのマルチブートテーブルの両方にアクセスするためのこのGDTトリックのバリエーション、または上記の問題を回避するある種の事前定義されたページテーブルを使用する場合、おそらくPSEが関係しますか?