1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Траблы с получением карты памяти

Тема в разделе "WASM.OS.DEVEL", создана пользователем _s_a_t_a_n_, 8 июн 2008.

  1. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Здравствуйте уважаемые программисты и мастера ассемблера :)
    Столкнулся с проблемой получения карты памяти из информационной таблицы, которую GRUB передает ядру при загрузке последнего в память.
    Опишу несколько моментов в моем коде для лучшего понимания сути проблемы:

    *[1] Поле флагов в multiboot заголовке бинарника.
    Из документации:
    В своем коде я установил все биты: 0, 1, 2 и 16 что соответствует 0x10007

    *[2] Состояние процессора после загрузки ОС
    В моем случае как показывает отладчик Bochs, эта информационная структура находится по адресу 0x0002E1A0

    *[3] Документация гласит также, то по нулевому смещению в информационной таблице расположено 4-байтное поле флагов, которое показывает какую информацию содержит информационная таблица. За передачу карты памяти отвечает бит 6 поля флагов, тоесть если он установлен, то по смещению 44 находится 4-х байтный размер таблицы карты памяти, а по смещению 48 - адрес карты памяти в адресном пространстве.
    Установлен ли бит 6 я проверяю следующим кодом:
    Код (Text):
    1. mov eax,dword [ebx]
    2. mov dword [infotable.flags],eax
    3. test [infotable.flags],1000000b
    4. 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
     
  2. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Нашел один баг в коде. Обновленные исходники прилагаются. Баг пофиксен но результаты всеравно оставляют делать лучшего:

    Получаю первый элемент карты памяти, который имеет размер 0 байт и этот элемент описывает участок памяти, начинающийся с адреса 0х0000000000000014, и длиной 0х0009FC0000000000 байт. Тип этого участка - 0, тоесть это зарезервированная память и не пригодна для программного использования.

    Поскольку первый элемент в карте памяти имеет нулевой размер, я не могу получить остальные элементы таблицы и пропарсить их.

    Товарищи, поактивнее плиз. Помогите разобраться с проблемой. Не стесняйтесь, отвечайте. Буду благодарен за любую помощь.