Здравствуйте уважаемые программисты и мастера ассемблера Столкнулся с проблемой получения карты памяти из информационной таблицы, которую GRUB передает ядру при загрузке последнего в память. Опишу несколько моментов в моем коде для лучшего понимания сути проблемы: *[1] Поле флагов в multiboot заголовке бинарника. Из документации: В своем коде я установил все биты: 0, 1, 2 и 16 что соответствует 0x10007 *[2] Состояние процессора после загрузки ОС В моем случае как показывает отладчик Bochs, эта информационная структура находится по адресу 0x0002E1A0 *[3] Документация гласит также, то по нулевому смещению в информационной таблице расположено 4-байтное поле флагов, которое показывает какую информацию содержит информационная таблица. За передачу карты памяти отвечает бит 6 поля флагов, тоесть если он установлен, то по смещению 44 находится 4-х байтный размер таблицы карты памяти, а по смещению 48 - адрес карты памяти в адресном пространстве. Установлен ли бит 6 я проверяю следующим кодом: Код (Text): mov eax,dword [ebx] mov dword [infotable.flags],eax test [infotable.flags],1000000b jnz get_mmap_data Отладчик показывает что бит 6 установлен, я получаю адрес таблицы с картой памяти и ее размер. Вот данные полученные в результате: Размер таблицы с картой памяти - 0x90 Адрес этой таблицы - 0x54d84 Пока что все нормально, правда возникают сомнения насчет очень маленького размера карты памяти - 0x90. Едем дальше... *[4] Из документации: Не буду утруждать вас описаниями процесса получения нужных полей, сей код вы можете посмотреть в исходниках которые я прикрепил к посту. Результаты таковы: (для первой и как оказалось единственной структуры) size: 0x90 base_addr_low: 0x54D84 base_addr_high: 0 length_low: 0 length_high: 0 type: 0 Получаю одну секцию недоступную для нормального использования и нулевой длины (!). Подскажите пожалуйста мне балде где я ошибся. Пытаюсь вылечить врожденную криворукость. Хотел получить карту памяти а в итоге получил шиш с маслом. P.S Насчет кода и оптимизации прошу не пинать т.к такой цели изначально не преследовалось на этом этапе. Заранее благодарен за помощь всем кто откликнулся. Исходники приложены в файле sources.txt
Нашел один баг в коде. Обновленные исходники прилагаются. Баг пофиксен но результаты всеравно оставляют делать лучшего: Получаю первый элемент карты памяти, который имеет размер 0 байт и этот элемент описывает участок памяти, начинающийся с адреса 0х0000000000000014, и длиной 0х0009FC0000000000 байт. Тип этого участка - 0, тоесть это зарезервированная память и не пригодна для программного использования. Поскольку первый элемент в карте памяти имеет нулевой размер, я не могу получить остальные элементы таблицы и пропарсить их. Товарищи, поактивнее плиз. Помогите разобраться с проблемой. Не стесняйтесь, отвечайте. Буду благодарен за любую помощь.