OSDev
http://osdev.su/

Grub
http://osdev.su/viewtopic.php?f=6&t=466
Страница 1 из 1

Автор:  418ImATeapot [ 03 ноя 2011, 15:33 ]
Заголовок сообщения:  Grub

Экспериментирую с мультибутом. В качестве подопытного кролика - Phantom-овский GRUB2, спасибо ему большое. Формат flat.
Возникли две проблемы:
-Груб грубо ругается, когда я добавляю какие-то флаги кроме f16 (явно заданные адреса загрузки ядра).
-Груб не воспринимает BSS. Это я обнаружил эмпирически - попытался вывести на в КОМ-порт адрес BIF-а. Адрес вывелся, но по этому адресу лежал сам этот адрес (те первым полем BIF-а стал указатель на BIF)! Потом выяснилось: адрес (ebx) я сохранил в буфере, лежавшем в начале BSS. Груб на место BSS запихнул BIF, а я затер его стеком и ebx-ом (адресом BIF-а). После того как удалил BSS все заработало, но не гонять же мне килонули! :-)
Это просто старая версия груба, или я чего-то не понял?

Автор:  Yoda [ 03 ноя 2011, 16:53 ]
Заголовок сообщения:  Re: Grub

Какой формат файла грузишь?
Я нормально гружу GRUB2 обычный бинарник мультибут. С форматом ELF не работал.

Автор:  418ImATeapot [ 03 ноя 2011, 17:39 ]
Заголовок сообщения:  Re: Grub

Flat Binary.
Yoda, а ты использовал BSS?

Автор:  phantom-84 [ 03 ноя 2011, 21:58 ]
Заголовок сообщения:  Re: Grub

Я вообще BSS не использую, т.е. bss_end_addr=load_end_addr, но думаю, что с этим в GRUB'е все в порядке. Также интересует, какие именно флаги тебе понадобились и для чего. Код тоже не мешало бы показать.

Автор:  418ImATeapot [ 03 ноя 2011, 22:35 ]
Заголовок сообщения:  Re: Grub

Слетает при любом флаге кроме f16. Конкретно мне нужен был f0 - выравнивание по страницам и f1 - необходима карта памяти, но в далеком будущем понадобиться и видео.
В BSS я пихаю стек загрузчика, а в перспективе и ядра - не в файле же его держать!

Код (кусками):

Нерабочая версия (с ошибками "Non-multiboot header"):
Код:

;Не смейтесь! У меня дурацкая привычка все в макросы пихать!
 MBH_Align4K equ     001b
 MBH_NeedMap equ   010b
 MBH_NeedVideo equ  100b
 MBH_Address equ 10000000000000000b

macro MultiBootMagics flg
 {
  dd MBH_Magic
  dd flg
  dd -flg-MBH_Magic
 }
  use32

  org 0x100000
load_addr:
header_addr:
  MultiBootMagics MBH_Align4K+MBH_NeedMap+MBH_Address
  dd header_addr
  dd load_addr
  dd load_end_addr
  dd bss_end_addr
  dd entry_addr
;------

load_end_addr:

virtual;Bss section
  MBInfo dd 0;Multiboot information structure (ebx)

  Stk:;stack
   db StackSize dup 0
 end virtual
bss_end_addr:
;-------


Рабочая (с костылями):
Код:

  use32

  org 0x100000
load_addr:
header_addr:
  MultiBootMagics 0x10000; MBH_Align4K+MBH_NeedMap+MBH_Address
  dd header_addr
  dd load_addr
  dd load_end_addr
  dd bss_end_addr
  dd entry_addr
;--------

;virtual;Bss section
  MBInfo dd 0;Multiboot information structure (ebx)

  Stk:;stack
   db StackSize dup 0
; end virtual

load_end_addr:
bss_end_addr:

Автор:  phantom-84 [ 03 ноя 2011, 23:09 ]
Заголовок сообщения:  Re: Grub

Любителям макросов посвящается :)
Код:
  ...
  dd -(flg)-MBH_Magic
  ...


Ну и чтобы использовать BSS, его вершина должна быть правильно прописана в файле :)
Код:
  ...
load_end_addr:
  virtual
  align 4
  MBInfo dd ?
  ...
  align 4
  rb StackSize ;*4 или dd - должно быть кратно четырем!
bss_end_addr: ; внутри virtual-блока!!!
  end virtual

Автор:  phantom-84 [ 03 ноя 2011, 23:41 ]
Заголовок сообщения:  Re: Grub

418ImATeapot писал(а):
Конкретно мне нужен был f0 - выравнивание по страницам
Если чё, это выравнивание модулей.

Цитата:
В BSS я пихаю стек загрузчика, а в перспективе и ядра - не в файле же его держать!
Как вариант можно использовать базовую память.

Автор:  418ImATeapot [ 04 ноя 2011, 00:12 ]
Заголовок сообщения:  Re: Grub

Спасибо. Скобку не поставил, как всегда:-)
А после virtual-а предыдущий org восстанавливается?
Me.RTFM
Извиняюсь.

Автор:  phantom-84 [ 04 ноя 2011, 14:59 ]
Заголовок сообщения:  Re: Grub

418ImATeapot писал(а):
А после virtual-а предыдущий org восстанавливается?
Да. Можно разместить метку load_end_addr после virtual-блока.

Автор:  pushkoff [ 12 мар 2012, 01:40 ]
Заголовок сообщения:  Re: Grub

Вот мой велосипед
компилю в Visual С++ 2010 EE
Код:
#include "type.h"
#include "boot.h"

#define START_ADDRES               0x100000
#define STACK_OFFSET               0x10000

void main();

#if defined(_M_IX86)

#define MULTIBOOT_HEADER_MAGIC         0x1BADB002
#define MULTIBOOT_HEADER_FLAGS         0x00010003
#define MULTIBOOT_BOOTLOADER_MAGIC      0x2BADB002

void start();

#pragma code_seg("._")
__declspec(allocate("._"))
const uint32_t mbheader[]=
{
   MULTIBOOT_HEADER_MAGIC,
   MULTIBOOT_HEADER_FLAGS,
   -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS),
   (uint32_t)mbheader,
   START_ADDRES,
   0,
   0,
   (uint32_t)start
};

#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/MERGE:._=.text")
#pragma comment(linker, "/ENTRY:main" )

#pragma code_seg()

BOOTINFO *bootinfo = 0;

static void __declspec(naked) start()
{
   __asm
   {
      mov   esp,100000h+STACK_OFFSET
      mov      bootinfo,ebx
      push   0
      popfd
   };
   main();
   __asm
   {
      cli
      hlt
   };
}

#else
#error Not defined multiboot entry for this arhitecture
#endif //_M_IX86

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/