2010-11-21 17 views
0

Grub ist ein Multiboot-konformer Bootloader. Wenn ein Betriebssystem gestartet wird, erstellt es eine Struktur, die den verfügbaren Speicher definiert, und hinterlässt einen Zeiger auf diese Struktur im Speicher.Kann jemand erklären, wie ich diese C-Datenstruktur verwende, die von grub kommt? Ich verstehe nicht hallo mem und lo mem

ich diese Informationen hier bekam:

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

Dies ist die Struktur, die ich glaube, ich habe Interesse an:

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; 

Also habe ich eine Sammlung von Speicherkarten Strukturen bekam . Wie auf der obigen Seite erwähnt, können Sie die Speicherabbildung sehen, indem Sie "displaymem" an der grub-Eingabeaufforderung eingeben. Das ist mein output

Aber ich verstehe nicht vollständig die Struktur ....

Warum werden die auf 0 (0x0) setzen die Länge? Muss ich wenig Speicher und viel Speicher kombinieren?

Er sagt, die Werte in 64-Bit sind es so haben zusammenschieben „low mem und hohe mem“ zusammen wie folgt aus:

__int64 full_address = (low_mem_addr + high_mem_addr);

oder ich erhalte 1 Liste niedrigen und hohen Adressen ausschließlich enthalten in ihnen?

und da ich eine 32-Bit-Maschine verwende, beziehe ich mich grundsätzlich auf jede eindeutige Adresse mit beiden Werten?

Ich erwartete eine einzige Liste von Adressen, wie displaymem zeigt, aber mit tatsächlichen Länge Felder bevölkert, aber ich sehe das nicht. Gibt es etwas, das ich nicht verstehe?

+1

Zitat: "base_addr_low ist die unteren 32 Bits der Startadresse, und base_addr_high ist die oberen 32 Bits", erhalten Sie resultierende Adresse wie folgt: res = baselow + basehigh << 32, aber res muss sein 64-Bit-Zeiger – fazo

+0

Warum also ist die Länge Null? Muss ich die Liste nach der Startadresse und dann nach der nächsten reservierten Adresse sortieren? Ich hätte gedacht, dass length_low und high combined gleich dem nächsten Eintrag in der verknüpften Liste sein würden. – Philluminati

+0

Laut dem Wiki-Link, den ich zur Verfügung gestellt habe, sind sie eine Kombination, und ich kann einfach unsigned long long x verwenden. – Philluminati

Antwort

0

Ok, im Grunde sind es nur zwei Variablen ... das sind 64-Bit-Zahlen, also was ist oben und was ist unten sind IDENTISCH!

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; 

Sie können die beiden Hälften erhalten wie folgt aus:

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

Die Frage war nur so einfach. : -s