OSDev

для всех
Текущее время: 03 май 2024, 02:24

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Загрузить свое ядро с помощью GRUB
СообщениеДобавлено: 10 окт 2007, 17:07 

Зарегистрирован: 09 окт 2007, 19:30
Сообщения: 4
Приветствую всех!

Подскажите как мне с помощью ГРАБА загрузить свое ядро.
Как я понял(из описания ГРАБА на англ.) ядро должно иметь определенный заголовок, чтобы ГРАБ смог его подцепить. Но дальше мне не совсем понятно.
Как я понимаю, что сначала грузится ГРАБ(1 и 2 стадии) , потом он считывает ядро с диска(Граб же сможет прочитать например ext2 раздел?), а дальше передает управление ядру.

Может кто покажет на примерах(асм) как все это происходит? И что за заголовки ядра такие?
Очень хочется увидеть как загрузить наипростейшее ядро(с простым цыклом внутри например. уточню: ядро чистый бинарный формат).

Очень хочется разобраться в этом вопросе(для меня как для энтузиаста это очень важно :) )

Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 окт 2007, 00:45 

Зарегистрирован: 13 июл 2007, 23:16
Сообщения: 23
Вот пример на fasm. Формат - ELF. Вызывает функцию _kernel_main с прототипом extern "C" void _kernel_main(void).

format ELF
section '.text' executable
extrn _kernel_main
public _start
MULTIBOOT_PAGE_ALIGN = 1 shl 0
MULTIBOOT_MEMORY_INFO = 1 shl 1

MULTIBOOT_HEADER_MAGIC = 1BADB002h
MULTIBOOT_HEADER_FLAGS = MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO
CHECKSUM = -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd CHECKSUM

_start:
mov esp, 0x200000-4
push ebx
call _kernel_main
cli
hlt


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 окт 2007, 09:12 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 75
boot.c
Код:
#include "boot.h"
#define START_ADDRES     0x100000#define STACK_OFFSET            0x10000#define IMAGE_SIZE      0x600#define BSS_SIZE      0x200

void main();
#if defined(_M_IX86)
#define MULTIBOOT_HEADER_MAGIC   0x1BADB002#define MULTIBOOT_HEADER_FLAGS    0x00010003#define MULTIBOOT_BOOTLOADER_MAGIC  0x2BADB002
#pragma comment(linker, "/merge:.rdata=.data")

BOOTINFO *bootinfo;

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

static const unsigned mbheader[]=
{
  MULTIBOOT_HEADER_MAGIC,
    MULTIBOOT_HEADER_FLAGS,
    -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS),
        (unsigned)mbheader,
        START_ADDRES,
      START_ADDRES+IMAGE_SIZE,
   START_ADDRES+IMAGE_SIZE+BSS_SIZE,
  (unsigned)start
};
#else#error Not defined multiboot entry for this arhitecture#endif //_M_IX86

boot.h
Код:
#if defined(_M_IX86)

typedef struct _BOOTMODULE
{
  unsigned  mod_start;
  unsigned  mod_end;
  char*  string;
  unsigned  reserved;
} BOOTMODULE;

typedef struct _BOOTINFO
{
  unsigned  flags;
  unsigned  mem_lower;
  unsigned  mem_upper;
  unsigned  boot_device;
  char*  cmdline;
  unsigned  mods_count;
  BOOTMODULE*        mods_addr;
} BOOTINFO;

extern BOOTINFO *bootinfo;
#define get_cmd_line() (bootinfo->cmdline)
#else
#error Not defined multiboot entry for this arhitecture#endif //_M_IX86


только не забудь переопределить вот эти константы
Код:
#define START_ADDRES               0x100000#define STACK_OFFSET               0x10000#define IMAGE_SIZE                  0x600#define BSS_SIZE                  0x200


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 окт 2007, 14:36 

Зарегистрирован: 09 окт 2007, 19:30
Сообщения: 4
То что нужно!!! Спасибо.

И тутже нахожу в исходниках ГРАБА пример ядра( gas + C)(docs/boot.S, doc/kernel.c, doc/multiboot.h). Делаем ./configure --enable-example-kernel и идем сразуже в ДОК делать маке. Полученное ядро (kernel) прописываем в грабе и после перезагрузки любуемся :))))

Думаю щас во всем разберусь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 окт 2007, 14:32 

Зарегистрирован: 09 окт 2007, 19:30
Сообщения: 4
После прочтения multiboot.info вроде как нашел способ загрузки чистого бинарного формата ядра.
FASM
Format binary
Код:
format binary
use32

MB_HEADER_MAGIC  =0x1BADB002
MB_HEADER_FLAGS  =0x00010003;

org 0x200000
  align   4
_kheader: ;Начало заголовка
  dd      MB_HEADER_MAGIC;Сигнатура
      dd      MB_HEADER_FLAGS; Флаги(см доку)
        dd      -(MB_HEADER_MAGIC + MB_HEADER_FLAGS);Контрольная сумма
     dd      _kheader; header_addr начало заголовка
     dd      _kheader; начало сегмента ТЕХТ. меньше или равно _header_addr
      dd      0x0;load_end_addr отдадим на самотек
       dd      0x0;bss_end_addr тоже
      dd      _kstart; точка входа


_kstart:
        mov     esp, 0x200000
  push    0
  popf
       push    ebx;info
       push    eax;header
;
;      Тут к примеру так:
;       call      kernel_main
;
 cli
        hlt


Все грузится и работает.
Хотелось бы услышать ваши замечания/предложения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 окт 2007, 14:58 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Видимо, все правильно. Только судя по всему в стек заносятся два аргумента для подпрограммы kernel_main, а т.к. ее вызов закомментирован, то и их можно закомментировать.


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

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


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

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


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

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