0

Grub はマルチブート対応のブートローダーです。オペレーティング システムを起動すると、利用可能なメモリを定義する構造を作成し、その構造へのポインタをメモリに残します。

ここでその情報を入手しました:

http://wiki.osdev.org/Detecting_Memory_(x86)#Memory_Map_Via_GRUB

これは私が興味を持っていると思う構造です:

 typedef struct memory_map
 {
   unsigned long size;
   unsigned long base_addr_low;
   unsigned long base_addr_high;
   unsigned long length_low;
   unsigned long length_high;
   unsigned long type;
 } memory_map_t;

だから私はメモリマップ構造のコレクションを持っています。上記のページに記載されているように、grub プロンプトで「displaymem」と入力すると、メモリ マップを表示できます。これは私の出力です

でも構造がよくわからない…。

長さが 0 (0x0) に設定されているのはなぜですか? 低メモリと高メモリを組み合わせる必要がありますか?

値は64ビットであると言われているので、次のように「低メモリと高メモリ」を一緒にプッシュしました:

__int64 full_address = (low_mem_addr + high_mem_addr);

または、低アドレスと高アドレスの両方を排他的に含む 1 つのリストを取得していますか?

私は32ビットマシンを使用しているので、基本的に両方の値でそれぞれの一意のアドレスを参照しますか?

ショーのようなアドレスの単一のリストを期待してdisplaymemいましたが、実際の長さのフィールドが入力されていましたが、それが表示されていません。わからないことがありますか?

4

1 に答える 1

0

わかりました、基本的には 2 つの変数だけです...これは 64 ビットの数値なので、上にあるものと下にあるものは同一です!

typedef struct memory_map
 {
   unsigned long size;
   //unsigned long base_addr_low;
   //unsigned long base_addr_high;
   unsigned long long base_addr;
   // unsigned long length_low;
   // unsigned long length_high;
   unsigned long long length; //holds both halves.
   unsigned long type;
 } memory_map_t;

次のように 2 つの半分を取り出すことができます。

unsigned long base_addr_low = base_addr
unsigned long base_addr_high = base_addr >> 32

質問はとてもシンプルでした。:-s

于 2011-02-13T01:36:57.863 に答える