私は小さな 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 強に設定すると、次の質問につながります。
4GiB しかインストールしていないのに、RAM の合計が 4GiB を超えているのはなぜですか?
メモリ マップの最後のベース アドレスが 0x0000000100000000 なのはなぜですか? RAM が 4GiB しかない場合、すべてをアドレス指定するために必要な最大アドレス サイズは 32 ビットになります。ここで何か誤解していますか?