7

私は小さな x86 カーネルに取り組んでいます。GRUB がマルチブート ヘッダーで提供するメモリ マップにアクセスして読み取ろうとしています。Intel i3 CPU と 4 GiB の RAM があります。このマシンでの実行中に、次のメモリ マップを読み込んでいます。

 --Base Address--          --Length--      --Type--

0x0000000000000000     0x000000000009d000     0x1
0x000000000009d000     0x0000000000003000     0x2
0x00000000000e0000     0x0000000000020000     0x2
0x0000000000100000     0x00000000bb53f000     0x1
0x00000000bb63f000     0x0000000000080000     0x2
0x00000000bb6bf000     0x0000000000100000     0x4
0x00000000bb7bf000     0x0000000000040000     0x3
0x00000000bb7ff000     0x0000000000001000     0x1
0x00000000bb800000     0x0000000004800000     0x2
0x00000000e0000000     0x0000000010000000     0x2
0x00000000feb00000     0x0000000000004000     0x2
0x00000000fec00000     0x0000000000001000     0x2
0x00000000fed10000     0x0000000000004000     0x2
0x00000000fed18000     0x0000000000002000     0x2
0x00000000fed1b000     0x0000000000005000     0x2
0x00000000fee00000     0x0000000000001000     0x2
0x00000000ffe80000     0x0000000000180000     0x2
0x0000000100000000     0x0000000038000000     0x1

利用可能なメモリ領域を合計すると...

0x1 (利用可能) - 3893.8 MiB

最後の 200 程度の MiB を他のデバイス用に予約しておくと、これはほぼ正しいように思えます。唯一の問題は、他のメモリ タイプの合計です。

0x2、0x3、0x4 - 331.5 MiB

RAM の総量を 4225.3 MiB または4.1 GiB 強に設定すると、次の質問につながります。

  1. 4GiB しかインストールしていないのに、RAM の合計が 4GiB を超えているのはなぜですか?

  2. メモリ マップの最後のベース アドレスが 0x0000000100000000 なのはなぜですか? RAM が 4GiB しかない場合、すべてをアドレス指定するために必要な最大アドレス サイズは 32 ビットになります。ここで何か誤解していますか?

4

1 に答える 1

3

いくつかの考え:

  • アドレス空間 != 物理メモリ サイズ。
  • i3 は、64 ビット、または 36 ビット PAE を使用する 32 ビット モード (オプション、カーネル サポートあり) の仮想アドレス空間をサポートします。起動した 32 ビット システムで実際に 4GiB の RAM を使用できる場合は、PAE を有効にする必要があります。確認方法:https ://serverfault.com/q/247080
  • AFAIR、これらの範囲は重複して任意の順序で表示される可能性があるため、最も制限されたタイプまたは範囲分割への順序付けと再入力が必要です。
  • その最後のベース アドレス0x0000000100000000は >= 2^32 です。これは通常、ハードウェア、ROM イメージ、およびその他の特別な範囲が (すべての?) PC で 2^32 未満に割り当てられるためです。したがって、2^32 以上のメイン メモリ範囲にアクセスするには、PAE またはロング モードのいずれかが必要です。

編集:

詳細については、こちらをご覧ください: http://wiki.osdev.org/Detecting_Memory_%28x86%29

編集2:

今日、Sysinternals ツールを見つけました。このツールは、関連する設定を変更せずに、EFI システムの次の物理範囲マッピングを示しています。ご覧のとおり、64GiB のメイン メモリはすべて0x1000000002^32 にマッピングされています。

Win 7 / ASUS EFI BIOS の Sysinternals RamMap

于 2013-09-21T18:56:50.137 に答える