5

主に学習目的で 80386 プロセッサ用の小さなカーネルを作成しようとしており、使用可能な RAM の完全なメモリ マップを取得したいと考えています。

BIOS に直接クエリを実行するよりも、GRUB を使用して実行する方が可能であり、より優れていることを読みました。

どうすればいいのか教えてもらえますか?

特に、リアル モードで BIOS 機能を使用するには、BIOS 割り込みを使用し、いくつかのレジスタで目的の値を取得します。GRUB が提供する関数を使用する場合、実際に同等の方法は何ですか?

4

1 に答える 1

2

これがカーネルで使用するプロセスです (これは 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 がコメントに投稿したように、これを開始するための優れたリンクを次に示します。

于 2014-10-31T22:45:14.317 に答える