OSDev http://osdev.su/ |
|
Загрузить свое ядро с помощью GRUB http://osdev.su/viewtopic.php?f=6&t=154 |
Страница 1 из 1 |
Автор: | srepus [ 10 окт 2007, 17:07 ] |
Заголовок сообщения: | Загрузить свое ядро с помощью GRUB |
Приветствую всех! Подскажите как мне с помощью ГРАБА загрузить свое ядро. Как я понял(из описания ГРАБА на англ.) ядро должно иметь определенный заголовок, чтобы ГРАБ смог его подцепить. Но дальше мне не совсем понятно. Как я понимаю, что сначала грузится ГРАБ(1 и 2 стадии) , потом он считывает ядро с диска(Граб же сможет прочитать например ext2 раздел?), а дальше передает управление ядру. Может кто покажет на примерах(асм) как все это происходит? И что за заголовки ядра такие? Очень хочется увидеть как загрузить наипростейшее ядро(с простым цыклом внутри например. уточню: ядро чистый бинарный формат). Очень хочется разобраться в этом вопросе(для меня как для энтузиаста это очень важно :) ) Спасибо. |
Автор: | p_aleksandrov [ 11 окт 2007, 00:45 ] |
Заголовок сообщения: | Re: Загрузить свое ядро с помощью GRUB |
Вот пример на 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 |
Автор: | pushkoff [ 11 окт 2007, 09:12 ] |
Заголовок сообщения: | Re: Загрузить свое ядро с помощью GRUB |
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
|
Автор: | srepus [ 11 окт 2007, 14:36 ] |
Заголовок сообщения: | Re: Загрузить свое ядро с помощью GRUB |
То что нужно!!! Спасибо. И тутже нахожу в исходниках ГРАБА пример ядра( gas + C)(docs/boot.S, doc/kernel.c, doc/multiboot.h). Делаем ./configure --enable-example-kernel и идем сразуже в ДОК делать маке. Полученное ядро (kernel) прописываем в грабе и после перезагрузки любуемся :)))) Думаю щас во всем разберусь. |
Автор: | srepus [ 19 окт 2007, 14:32 ] |
Заголовок сообщения: | Re: Загрузить свое ядро с помощью GRUB |
После прочтения 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 Все грузится и работает. Хотелось бы услышать ваши замечания/предложения. |
Автор: | phantom-84 [ 19 окт 2007, 14:58 ] |
Заголовок сообщения: | Re: Загрузить свое ядро с помощью GRUB |
Видимо, все правильно. Только судя по всему в стек заносятся два аргумента для подпрограммы kernel_main, а т.к. ее вызов закомментирован, то и их можно закомментировать. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |