Здавствуйте уважаемые мастера, выношу на Ваш суд мое неудавшееся творение. Я пишу ядро которое должно грузиться GRUB-ом и (поначалу) тупо выводить символ на экран. Вот код ядра: Код (Text): org 0x100000 ;+--------------------------------------------------------+ ;| GRUB Multiboot Header | ;+--------------------------------------------------------+ load_addr: dd 0x1BADB002 ; signature dd 0x00010006 ; flags dd -(0x1BADB002+0x00010006) ; checksum dd load_addr ; header_addr dd load_addr ; load_addr dd end_addr ; load_end_addr dd end_addr ; bss_end_addr dd entry_addr ; entry_addr dd 0x00000001 ; mod_type: text dd 0x00000050 ; width: 80 dd 0x00000019 ; height: 25 dd 0x00000000 ; color_depth: 0 entry_addr: ;+--------------------------------------------------------+ ;| Executive code | ;+--------------------------------------------------------+ mov [0x000B8000],byte 'A' mov [0x000B8001],byte 10011100b hlt end_addr: Сей код в теории должен записать символ 'A' в тектстовую видеопамять, но практика показывает обратное - на экран ничто выводиться не желает =\ Ядро грузится GRUB-ом при буте с CD. На момент передачи управления в ядро, состояние машины следующее: * eax содержит сигнатуру 0x1BADB002 * ebx содержит 32-битный адрес информационной стуктуры загрузчика * cs указывает на сегмент кода с правами чтение/исполнение; оффсет 0, лимит 0xFFFFFFFF * ds,es,fs,gs,ss указывают на сегмент данных с правами чтение/запись с оффсетом 0 и лимитом 0xFFFFFFFF * Gate A20 включен * Бит PE установлен * paging сброшен Я исходил из того что коли в сегментные регистры загружен селектор сегмента данных, который растянут на всю память (оффсет 0 и лимит 0xFFFFFFFF) то если я запишу символ по смещению текстового видеобуфера (0x000B8000) то символ появится на экране. Подскажите пожалуйста возможные ошибки и решения. Я новичек в ассемблере, поэтому прошу сильно не пинать.
_s_a_t_a_n_ Так поглядел бы исходники ядра. Я что-то сомневаюсь, что в 32-битном режиме видеобуфер находится по адресу b8000 - это адрес для 16-бит реал режима. VESA надо юзать. По стандарту первые 2 Гбайта - это область программ, ядро и память устройств лежит выше 2 Гбайт. Видеокарты маппят свой видео-буфер на свободный адрес, т.ч. нет фиксированного адреса даже для одной карты. Все зависит от остального железа.
Я так понял VESA это "надстройка" над стандартом VGA. Мне нужен текстовый режим 80х25. Я скачал документацию по VBE 3, но хочу уточнить нельзя ли просто ограничиться программированием VGA адаптера, не залезая в VBE?
Можно, если ты работаешь в реал-моде. Если grub грузит тебя как ядро - я не знаю в каком режиме ты окажешься, по идее 32-протектед. Видео режим grub берет из файла конфигурации, т.ч. может и 80х25 быть, но вот где видео-буфер и как туда писать - смотри исходники ядра. Другого способа нет - можно спросить(посмотреть на форумах) у тех, кто это сделал. Возможно также посмотреть исходники самого grub - все-таки меньше чем ядро. Не исключен и вариант, что в ядре есть "пускач", который настраивает видео-буфер и память, но ???
Можно и в PM. Если ты работаешь с vga-режимами, то тебе достаточно для вывода видеоинформации стандартного диапазана 0xA0000-0xBFFFF, который с помощью страничной переадресации ты можешь прикрепить к любому участку адресного пространства.
_s_a_t_a_n_ У тебя привышает 8кб. А значит файл нужно будет уменьшить, пусть он сразазу начинается с этого заголовка. Это для того чтобы загрузчик мог найти GRUB Multiboot Header А следовательно header_addr - load_addr load_end_addr - load_addr И всетаки добавь вечный цикл вконце где hlt. valterg Ненадо людей путать. Можно использовать и VGA/EGA и VESA как в реальном так и защищенном режиме. И покакому же?
А вообще если используете Grub, читайте маны по Grub-у - там все написано. Там настолько много написано, что мне стало лень это читать. Видимо поэтому я и не использую Grub
Phantom_84 Я сегодня заглянул в справку по GRUB. Да там много написанно. Правда оказывается я не туда заглядывал. Все самое интерестное лежит в GRUB Multiboot и на самом деле все просто. http://www.gnu.org/software/grub/manual/multiboot/multiboot.html Не то что много, просто подробно все расеписанно. Так это я его проверял.
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