OSDev

для всех
Текущее время: 24 апр 2024, 05:15

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: GRUB
СообщениеДобавлено: 01 апр 2011, 14:55 

Зарегистрирован: 01 апр 2011, 14:36
Сообщения: 4
Вот начал писать ОС и столкнулся с такой проблемой:
Хочу что бы ядро моей системы загружалось с помощью 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:


что тут не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 01 апр 2011, 21:38 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Не знаю, у меня вот это работает:
Код:
; --------------------
; 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:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 02 апр 2011, 00:41 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
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:
...


Последний раз редактировалось Himik 02 апр 2011, 00:56, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 02 апр 2011, 00:51 

Зарегистрирован: 01 апр 2011, 14:36
Сообщения: 4
спс. ошибку так и не нашел, поэтом пользую то что есть.

З.Ы. Makefile:
Цитата:
all: kernel.asm
fasm kernel.asm kernel

clean:
rm -f kernel

так что компиляция верная


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 02 апр 2011, 01:01 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Пробуй пример от phantom-84. Ещё проверь содержимое готового бинарника. Он должен начинаться так:
02 B0 AD 1B 03 00 01 00 FB 4F 51 E4 ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 02 апр 2011, 13:30 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Ненавижу линукс, однако приходится с ним иметь дело. Но это так, лирическое отступление.
Тоже вопрос по 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
Вадафак??

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 02 апр 2011, 19:13 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
GrubOnFloppy.zip - GRUB
GrubOnFloppy-198.zip - GRUB 2

Компилируешь floppy.asc fasm'ом. Только смотри, чтобы GRUB 2 был именно этой версии, потому что он грешит вершн-специфичностью своих загрузочных структур (см. комментарий к моей статье: GRUB Internals).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 02 апр 2011, 19:52 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Yoda, в grub-install указывается имя дискового (блочного) устройства, а не файл. Некое устройство из директории /dev/...
Для физической дискеты будет /dev/fd0
Для других дисков, надо смотреть имя используемого устройства. Открыть /dev/disk/by-label
найти нужный диск по имени, открыть его свойства, и посмотреть устройство.
Я на дискету ставить не пробовал, успех не гарантирую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 02 апр 2011, 23:08 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Himik писал(а):
Yoda, в grub-install указывается имя дискового (блочного) устройства, а не файл. Некое устройство из директории /dev/...
Для физической дискеты будет /dev/fd0
Именно это я и проверил первым же делом:
Yoda писал(а):
...Точно та же картина, если работать не с образом в файле, а с физическим диском (дискетой)...

phantom-84,
Огромное спасибо! Сейчас поэкспериментирую с твоими образами.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GRUB
СообщениеДобавлено: 03 апр 2011, 00:35 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
К команде grub-install надо добавить параметр --force, потому что Grub не любит дискеты.
А вместо файла указать /dev/loop0
# Устанавливаем ГРУБ
sudo grub-install --root-directory=/mnt --force /dev/loop0
Проверено, работает, и нормально грузится.

В общем-то монтировать образ в /mnt не очень правильно, потому что в mnt может быть несколько примонтированных дисков. Надо делать поддиректорию /mnt/fd0.

В /boot/grub очень много разных файлов, которые для загрузки с дискеты не нужны. Там все файлы с именами различных файловых систем, кроме fat.mod можно соптимизировать.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB