2010-11-21 9 views
0

GRUBはマルチブート対応のブートローダーであるハイテクMEMとLO MEMを理解していません。オペレーティングシステムを起動すると、使用可能なメモリを定義する構造体が作成され、その構造体へのポインタがメモリに残されます。grubから来るこのCのデータ構造をどのように使用するのか、私は

私はここでその情報を得た:

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」と入力して メモリマップを見ることができます。これは私のoutput

しかし、私は完全に構造を理解していない....

なぜ長さが0(0x0の)に設定されている

?低メモリと高メモリを組み合わせる必要がありますか?

それはとてもそれがこのように一緒に一緒に「低MEMと高MEM」を押した値が64ビットであると言う:

__int64 full_address = (low_mem_addr + high_mem_addr);

または私はもっぱら低域と高両方のアドレスを含む1つのリストを取得していますがそれらに?

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

私はdisplaymemショーのようなしかし人口の実際の長さフィールドと、アドレスの1つのリストを期待していたが、私はそれを見ていませんよ。私が理解できないものはありますか?

+1

引用: "base_addr_lowは開始アドレスの下位32ビットで、base_addr_highは上位32ビットです"というような結果のアドレスが得られます。res = baselow + basehigh << 32、resにする必要があります64ビットポインタ – fazo

+0

なぜ長さはゼロですか?開始アドレスと次に予約されたアドレスを組み合わせてリストをソートする必要はありますか?私はlength_lowと高い結合がリンクされたリストの次のエントリと等しくなると思っていたでしょう。 – Philluminati

+0

は、私が提供するのwikiリンクによると、彼らは組み合わせであり、私は符号なしの長い長いXを使用することができます。 – Philluminati

答えて

0

[OK]を、基本的にそれはそう何上記とは何か以下であるが同一で、64ビットの番号でちょうど2つの変数...です!

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; 

あなたは、このように二つの半分を得ることができます:質問だけでは簡単だった

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

。 :-s

関連する問題