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

Grub - это мультизагрузочный загрузчик. Когда он загружает операционную систему, он создает структуру, определяющую доступную память, и оставляет указатель на эту структуру в памяти.

Я получил эту информацию здесь:

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

Это структура, которая мне интересна:

 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 ответ

Решение

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

Другие вопросы по тегам