OSDev
http://osdev.ru/

GRUB
http://osdev.ru/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/