1

現在、上位半分のカーネルを構築しています。ブートローダーはカーネルを物理アドレス 0x100000(1M) にロードし、ID マッピングは 0 ~ 4MB に設定されています。ここで質問があります: どうすればより高い仮想アドレス (たとえば 3GB) にジャンプできますか?

私はこの質問をグーグルで検索し、2 つの方法を見つけました。1 つはアドレス スペース ワープ アラウンドを使用する方法で、もう 1 つはページ エントリを設定して 3GB ~ 3GB + 4MB を 0 ~ 4MB にマップしてから、より高いアドレスに「ジャンプ」する方法です。使用することにしました。 2番目の方法ですが、それを実装するのに十分な情報が見つかりません. カーネルを逆アセンブルしたところ、すべてのアドレスが絶対アドレスであることがわかったので、単一の「jmp」命令では不十分だと思います。私が考えることができる唯一の方法は、3GBを超える仮想アドレスに関数があり、この関数を下位スペースで呼び出し、上位スペースで実行し、この関数が返されないことです。これが正しい場合、どうすればこれを行うことができますか?

4

1 に答える 1

0

私のカーネルK-OSはこれを行います。

基本的に、リンカー スクリプトを記述して、カーネル全体を目的の「上位半分」アドレスにシフトする必要があります (これを参照してください)。次に、カーネルのエントリ ポイントである小さなアセンブラ スニペット (これを参照) を追加する必要があります。

このスニペットでは、相対アドレスのみを使用し、上位半分のページ テーブルを設定する必要があります (カーネル全体を、リンカー スクリプトで指定した場所にマップします)。最後に、そのスニペットは "Higher-half" エントリ ポイントに JMP し、C コードを呼び出す必要があります。

于 2013-08-05T00:30:55.207 に答える