OSDev

для всех
Текущее время: 29 апр 2024, 02:22

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Grub
СообщениеДобавлено: 03 ноя 2011, 15:33 
Аватара пользователя

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

_________________
Found a CPU. LAPIC ID: 00


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Grub
СообщениеДобавлено: 03 ноя 2011, 16:53 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Какой формат файла грузишь?
Я нормально гружу GRUB2 обычный бинарник мультибут. С форматом ELF не работал.

_________________
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, 17:39 
Аватара пользователя

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
Flat Binary.
Yoda, а ты использовал BSS?

_________________
Found a CPU. LAPIC ID: 00


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

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


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

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
Слетает при любом флаге кроме 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:

_________________
Found a CPU. LAPIC ID: 00


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Любителям макросов посвящается :)
Код:
  ...
  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


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
418ImATeapot писал(а):
Конкретно мне нужен был f0 - выравнивание по страницам
Если чё, это выравнивание модулей.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Grub
СообщениеДобавлено: 04 ноя 2011, 00:12 
Аватара пользователя

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

_________________
Found a CPU. LAPIC ID: 00


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Grub
СообщениеДобавлено: 04 ноя 2011, 14:59 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Grub
СообщениеДобавлено: 12 мар 2012, 01:40 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
Вот мой велосипед
компилю в 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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

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


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

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


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

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