2

x86 アーキテクチャでは、Linux カーネル 2.6.x、32 ビット システム

仮想アドレス 0xC0000000 ~ 0xFFFFFFFF と理解しています

カーネル用に予約されています。

この仮想アドレスは、次の方法で物理アドレスに変換できます。

0xC0000000 を減算します。

ただし、結果も同じだと思います。MMUは翻訳します

ページテーブルをウォークスルーして、カーネル仮想アドレス (0xC0851000 など) を物理アドレスに変換します。

そのような

CR3 -> ページ ディレクトリ -> ページ テーブル -> PFN。

私は正しいですか、それとも間違っていますか? 間違っている場合は訂正してください。

x86、Linux 32 ビット システムでハードウェア ベースのカーネル モニターを開発する必要があります。

だから私はこの問題を知る必要があります

助けてください。

4

2 に答える 2

3

カーネル論理アドレスについては、正しいです。ただし、カーネル仮想アドレスは、によって割り当てられるメモリと同様にvmalloc、論理アドレス空間を特徴付ける物理アドレスに 1 対 1 でマッピングされるとは限りません。

カーネルの論理アドレスは、オフセットを差し引いて常に物理アドレスに変換されるとは限らないことに注意してください (これは x86 では当てはまりますが、たとえば AVR32 では当てはまりません)。

于 2012-07-24T06:32:15.407 に答える
0

「そして、この仮想アドレスは、次の方法で物理アドレスに変換できます。

0xC0000000 を引く」

カーネル仮想アドレスのページ テーブルがそのように構成されているため、人々はあなたが言及したショートカットを考え出しました。

于 2012-10-29T05:47:34.347 に答える