OSDev http://osdev.su/ |
|
GRUB http://osdev.su/viewtopic.php?f=6&t=407 |
Страница 1 из 2 |
Автор: | Stamerlan [ 01 апр 2011, 14:55 ] |
Заголовок сообщения: | GRUB |
Вот начал писать ОС и столкнулся с такой проблемой: Хочу что бы ядро моей системы загружалось с помощью grub (0.97). покопался в multiboot specification и вроде все делаю правильно, но grub при загрузке ядра пишет: Цитата: grub> kernel /boot/kernel [Multiboot-kludge, loadaddr=0x200000, text-and-data=0x58 Error 13: Invalid or unsupported executable format текст ядра (fasm): Код: use32 org 0x00200000 STACK_SIZE equ 0x1000 MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 MULTIBOOT_HEADER_FLAGS equ 0x00010003 _entry: jmp kinit multiboot_header: align 4 ; Сигнатура dd MULTIBOOT_HEADER_MAGIC ; Флаги dd MULTIBOOT_HEADER_FLAGS ; Контрольная сумма dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; header_addr dd multiboot_header ; load_addr dd _entry ; load_end_addr dd 0 ; bss_end_addr dd 0 ; entry_addr dd kinit kinit: ; Установка стека mov esp, _stack + STACK_SIZE ; Код ядра ; Проверка сигнатуры cmp eax, 0x2BADB002 jne halt ; Проверка доступности модулей mov eax, [ebx] ; в eax flags test eax, 0x08 ; flags[3] установлен? jz halt ; Вызов функции модуля add ebx, 24 ; ebx = *mods_addr mov eax, [ebx] ; в eax указатель на module_struct mov ebx, msg mov eax, [eax] ; Укзазатель на адрес загрузки первого модуля call eax ; вызов модуля ; Стоп halt: hlt jmp halt msg db 'Test message!', 0 _stack: что тут не так? |
Автор: | phantom-84 [ 01 апр 2011, 21:38 ] |
Заголовок сообщения: | Re: GRUB |
Не знаю, у меня вот это работает: Код: ; --------------------
; Kernel stub for GRUB ; -------------------- MBH_MAGIC equ 0x1BADB002 MBH_FLAGS equ 0x10000 use32 org 0x100000 load_addr: header_addr: dd MBH_MAGIC dd MBH_FLAGS dd -MBH_MAGIC-MBH_FLAGS dd header_addr dd load_addr dd load_end_addr dd bss_end_addr dd entry_addr entry_addr: jmp $ load_end_addr: bss_end_addr: |
Автор: | Himik [ 02 апр 2011, 00:41 ] |
Заголовок сообщения: | Re: GRUB |
Stamerlan, вроде всё правильно. Больше похоже на неправильную компиляцию. Делай чистый бинарник, без формата. А _entry лучше перенести за структуру, чтобы её не выравнивать и не перепрыгивать. Как у phantom-84. Примерно так: Код: multiboot_header:
; Сигнатура dd MULTIBOOT_HEADER_MAGIC ; Флаги dd MULTIBOOT_HEADER_FLAGS ; Контрольная сумма dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; header_addr dd multiboot_header ; load_addr dd multiboot_header ; load_end_addr dd 0 ; bss_end_addr dd 0 ; entry_addr dd _entry _entry: ... |
Автор: | Stamerlan [ 02 апр 2011, 00:51 ] |
Заголовок сообщения: | Re: GRUB |
спс. ошибку так и не нашел, поэтом пользую то что есть. З.Ы. Makefile: Цитата: all: kernel.asm fasm kernel.asm kernel clean: rm -f kernel так что компиляция верная |
Автор: | Himik [ 02 апр 2011, 01:01 ] |
Заголовок сообщения: | Re: GRUB |
Пробуй пример от phantom-84. Ещё проверь содержимое готового бинарника. Он должен начинаться так: 02 B0 AD 1B 03 00 01 00 FB 4F 51 E4 ... |
Автор: | Yoda [ 02 апр 2011, 13:30 ] |
Заголовок сообщения: | Re: GRUB |
Ненавижу линукс, однако приходится с ним иметь дело. Но это так, лирическое отступление. Тоже вопрос по GRUBу. Хочу сделать загрузочную дискету FAT12 с GRUB2. Установлена Ubuntu 10.10, GRUB2 1.98 Производим шаманство командной строки: # Создаём образ диска dd if=/dev/zero of=fdd.img bs=1K count=1440 # Делаем файловую систему FAT12 mkdosfs fdd.img # Монтируем образ диска sudo mount -o loop fdd.img /mnt # Устанавливаем ГРУБ sudo grub-install --root-directory=/mnt fdd.img # Размонтируем sudo umount /mnt ГРУБ никаких ошибок не выдаёт, но видим, что бут-сектор не прописан (там только заглушка от mkfs), соответственно, образ не грузится. Файлы загрузчика на диске есть. Точно та же картина, если работать не с образом в файле, а с физическим диском (дискетой). Если делать файловую систему EXT2, EXT3 или EXT4, то загрузчик на дискету не помещается. Как сделать загрузочную дискету с GRUB2? Как заставить GRUB сформировать загрузочный сектор? Нашёл якобы универсальный загрузочный диск GRUB2. Скомпилировал предложенный phantom-84 код NASMом в чистый бинарник. При попытке загрузить его с этого командой: linux (fd0)/BOOT.SYS Ошибка error: cannot read the Linux header Вадафак?? |
Автор: | phantom-84 [ 02 апр 2011, 19:13 ] |
Заголовок сообщения: | Re: GRUB |
GrubOnFloppy.zip - GRUB GrubOnFloppy-198.zip - GRUB 2 Компилируешь floppy.asc fasm'ом. Только смотри, чтобы GRUB 2 был именно этой версии, потому что он грешит вершн-специфичностью своих загрузочных структур (см. комментарий к моей статье: GRUB Internals). |
Автор: | Himik [ 02 апр 2011, 19:52 ] |
Заголовок сообщения: | Re: GRUB |
Yoda, в grub-install указывается имя дискового (блочного) устройства, а не файл. Некое устройство из директории /dev/... Для физической дискеты будет /dev/fd0 Для других дисков, надо смотреть имя используемого устройства. Открыть /dev/disk/by-label найти нужный диск по имени, открыть его свойства, и посмотреть устройство. Я на дискету ставить не пробовал, успех не гарантирую. |
Автор: | Yoda [ 02 апр 2011, 23:08 ] |
Заголовок сообщения: | Re: GRUB |
Himik писал(а): Yoda, в grub-install указывается имя дискового (блочного) устройства, а не файл. Некое устройство из директории /dev/... Именно это я и проверил первым же делом:Для физической дискеты будет /dev/fd0 Yoda писал(а): ...Точно та же картина, если работать не с образом в файле, а с физическим диском (дискетой)... phantom-84, Огромное спасибо! Сейчас поэкспериментирую с твоими образами. |
Автор: | Himik [ 03 апр 2011, 00:35 ] |
Заголовок сообщения: | Re: GRUB |
К команде grub-install надо добавить параметр --force, потому что Grub не любит дискеты. А вместо файла указать /dev/loop0 # Устанавливаем ГРУБ sudo grub-install --root-directory=/mnt --force /dev/loop0 Проверено, работает, и нормально грузится. В общем-то монтировать образ в /mnt не очень правильно, потому что в mnt может быть несколько примонтированных дисков. Надо делать поддиректорию /mnt/fd0. В /boot/grub очень много разных файлов, которые для загрузки с дискеты не нужны. Там все файлы с именами различных файловых систем, кроме fat.mod можно соптимизировать. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |