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/ |