Может кто-нибудь объяснить, как я использую эту структуру данных 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