Может кто-нибудь объяснить, как я использую эту структуру данных C, которая приходит из Grub?Я не понимаю привет мем и вот мем - PullRequest
0 голосов
/ 21 ноября 2010

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;

Итак, у меня есть коллекция структур карты памяти.Как упоминалось на предыдущей странице, вы можете увидеть карту памяти, набрав «displaymem» в приглашении grub.Это мой вывод

Но я не совсем понимаю структуру ....

Почему длины установлены в 0 (0x0)?Нужно ли объединять малую и верхнюю память?

Он говорит, что значения представлены в 64-битном формате, поэтому он объединял "low mem и high mem" вместе следующим образом:

__int64 full_address = (low_mem_addr + high_mem_addr);

или я получаю 1 список, содержащий исключительно низкие и высокие адреса?

и, поскольку я использую 32-битную машину, я в основном называю каждый уникальный адрес с обоими значениями?

Я ожидал один список адресов, например, displaymem, но с заполненными полями фактической длины, но я этого не вижу.Есть что-то, чего я не понимаю?

1 Ответ

0 голосов
/ 13 февраля 2011

Хорошо, в основном это всего лишь две переменные ... это 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;

Вы можете получить две половинки вот так:

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

Вопрос был так прост. : -S

...