Загрузка GRUB-ом

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

  1. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Здавствуйте уважаемые мастера, выношу на Ваш суд мое неудавшееся творение.
    Я пишу ядро которое должно грузиться GRUB-ом и (поначалу) тупо выводить символ на экран.
    Вот код ядра:
    Код (Text):
    1. org 0x100000
    2. ;+--------------------------------------------------------+
    3. ;|            GRUB Multiboot Header                       |
    4. ;+--------------------------------------------------------+
    5. load_addr:
    6. dd 0x1BADB002                   ; signature
    7. dd 0x00010006                   ; flags
    8. dd -(0x1BADB002+0x00010006)     ; checksum
    9. dd load_addr                    ; header_addr
    10. dd load_addr                    ; load_addr
    11. dd end_addr                     ; load_end_addr
    12. dd end_addr                     ; bss_end_addr
    13. dd entry_addr                   ; entry_addr
    14. dd 0x00000001                   ; mod_type: text
    15. dd 0x00000050                   ; width:  80
    16. dd 0x00000019                   ; height: 25
    17. dd 0x00000000                   ; color_depth: 0
    18. entry_addr:
    19. ;+--------------------------------------------------------+
    20. ;|               Executive code                           |
    21. ;+--------------------------------------------------------+
    22. mov [0x000B8000],byte 'A'
    23. mov [0x000B8001],byte 10011100b
    24. hlt
    25. end_addr:
    Сей код в теории должен записать символ 'A' в тектстовую видеопамять, но практика
    показывает обратное - на экран ничто выводиться не желает :dntknw: =\
    Ядро грузится GRUB-ом при буте с CD.
    На момент передачи управления в ядро, состояние машины следующее:
    * eax содержит сигнатуру 0x1BADB002
    * ebx содержит 32-битный адрес информационной стуктуры загрузчика
    * cs указывает на сегмент кода с правами чтение/исполнение; оффсет 0, лимит 0xFFFFFFFF
    * ds,es,fs,gs,ss указывают на сегмент данных с правами чтение/запись с оффсетом 0 и лимитом 0xFFFFFFFF
    * Gate A20 включен
    * Бит PE установлен
    * paging сброшен

    Я исходил из того что коли в сегментные регистры загружен селектор сегмента данных, который
    растянут на всю память (оффсет 0 и лимит 0xFFFFFFFF) то если я запишу символ по смещению текстового видеобуфера (0x000B8000) то символ появится на экране.

    Подскажите пожалуйста возможные ошибки и решения.
    Я новичек в ассемблере, поэтому прошу сильно не пинать.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    _s_a_t_a_n_
    Так поглядел бы исходники ядра. Я что-то сомневаюсь, что в 32-битном режиме видеобуфер находится по адресу b8000 - это адрес для 16-бит реал режима. VESA надо юзать. По стандарту первые 2 Гбайта - это область программ, ядро и память устройств лежит выше 2 Гбайт. Видеокарты маппят свой видео-буфер на свободный адрес, т.ч. нет фиксированного адреса даже для одной карты. Все зависит от остального железа.
     
  3. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Я так понял VESA это "надстройка" над стандартом VGA.
    Мне нужен текстовый режим 80х25.
    Я скачал документацию по VBE 3, но хочу уточнить нельзя ли просто
    ограничиться программированием VGA адаптера, не залезая в VBE?
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Можно, если ты работаешь в реал-моде. Если grub грузит тебя как ядро - я не знаю в каком режиме ты окажешься, по идее 32-протектед. Видео режим grub берет из файла конфигурации, т.ч. может и 80х25 быть, но вот где видео-буфер и как туда писать - смотри исходники ядра. Другого способа нет - можно спросить(посмотреть на форумах) у тех, кто это сделал. Возможно также посмотреть исходники самого grub - все-таки меньше чем ядро.
    Не исключен и вариант, что в ядре есть "пускач", который настраивает видео-буфер и память, но ???
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Можно и в PM. Если ты работаешь с vga-режимами, то тебе достаточно для вывода видеоинформации стандартного диапазана 0xA0000-0xBFFFF, который с помощью страничной переадресации ты можешь прикрепить к любому участку адресного пространства.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    _s_a_t_a_n_
    У тебя привышает 8кб. А значит файл нужно будет уменьшить, пусть он сразазу начинается с этого заголовка. Это для того чтобы загрузчик мог найти GRUB Multiboot Header
    А следовательно
    header_addr - load_addr
    load_end_addr - load_addr

    И всетаки добавь вечный цикл вконце где hlt.

    valterg
    Ненадо людей путать. Можно использовать и VGA/EGA и VESA как в реальном так и защищенном режиме.
    И покакому же?
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Pavia, по мелко-мягкому :)
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    А вообще если используете Grub, читайте маны по Grub-у - там все написано. Там настолько много написано, что мне стало лень это читать. Видимо поэтому я и не использую Grub :)
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Phantom_84
    Я сегодня заглянул в справку по GRUB. Да там много написанно. Правда оказывается я не туда заглядывал.
    Все самое интерестное лежит в GRUB Multiboot и на самом деле все просто.
    http://www.gnu.org/software/grub/manual/multiboot/multiboot.html
    Не то что много, просто подробно все расеписанно.

    Так это я его проверял. :)
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    http://www.linuxcenter.ru/lib/articles/programming/boot.phtml
    Тут почему-то в начале стоит jmp на исполняемый код и только потом заголовок.
    Ну и hlt тоже зациклен.
    А вот директива org может привести в тому (и наверное приводит), что точку входа просто неправильно определяют.
    ++++++++++++++++++++++=
    _s_a_t_a_n_ запустил я твой тест. Напиши в каком формате ядро делал, тогда можно искать причину. Я сделал просто : компильнул masm-ом и нашел дискету с grub и пустым ядром(тоже мессадж выводит). Вырезал из экзешки код, поправил адреса, вставил код в ядро и поправил адрес запуска в нем. Кстати ядро действительно грузится по адресу 0х100000, точка входа 0х101000 - это для формата elf32. Какие еще форматы есть не знаю, но чистый бинарник grub не признает - magic ему мало, либо он его использует потом. Выдает ошибку 13 Invalid or unsupported executable format
    /////////////////////////////////
    Наконец-то gnu.org стал доступен. Перевожу на русский в подтверждение своих слов.
    Ядро должно иметь формат исполняемого файла, который понимают ОС(какие не написано, но думаю все-таки Юниксы т.к. талдычут про a.out), а multiboot header должен следовать за стандартными заголовками(вот для этого 8 кило выделяется). Интересно, но в Vmware если сделать энтри у elf на 0х101000, то выводятся только атрибуты, а букву А не видно :-( Короче тот grub что у меня на дискете прыгает по энтри elf и плевать он хотел на то, что написано на gnu.org