これがカーネルで使用するプロセスです (これは 32 ビットであることに注意してください)。ブートストラップ アセンブリ ファイルで、GRUB にメモリ マップを提供するように指示します。
.set MEMINFO, 1 << 1 # Get memory map from GRUB
次に、GRUB はマルチブート情報構造体のアドレスをロードしebx
ます (この構造体にはメモリ マップのアドレスが含まれています)。次に、C コードを呼び出して、メモリ マップの実際の反復と処理を処理します。マップを反復処理するには、次のようなことを行います。
/* Macro to get next entry in memory map */
#define MMAP_NEXT(m) \
(multiboot_memory_map_t*)((uint32_t)m + m->size + sizeof(uint32_t))
void read_mmap(multiboot_info_t* mbt){
multiboot_memory_map_t* mmap = (multiboot_memory_map_t*) mbt->mmap_addr;
/* Iterate over memory map */
while((uint32_t)mmap < mbt->mmap_addr + mbt->mmap_length) {
// process the current memory map entry
mmap = MMAP_NEXT(mmap);
}
}
ここでmultiboot_info_t
、 とmultiboot_memory_map_t
は Gnu multiboot.h ファイルのように定義されています。Andrew Medico がコメントに投稿したように、これを開始するための優れたリンクを次に示します。