Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Azi am 06. June 2006, 16:10
-
Hallo, hier bin ich wieder!
Also, ich hab mich dazu entschlossen, den Kernel in C zu programmieren und GRUB als Bootloader zu verwenden. Leider gibt GRUB beim booten immer folgende Meldung aus:
Error 13: Invalid or unsupported format
Der Multiboot header ist vorhanden, auch mbchk sagt, dass alles okay sei.
Hier nun meine Dateien:
[boot.asm]
[Bits 32]
extern _main
global _start
section .text
_mbh:
dd 0x1BADB002
dd 0x00000000
dd 0xE4524FFE
dd _mbh
dd _start
dd 0x00000000
dd 0x00000000
dd _start
dd 0x00000000
dd 0x00000050
dd 0x00000019
dd 0x00000000
_start:
call _main
_stop:
jmp _stop
[aquanaos_kernel.c]
int main()
{
char *Text = "Welcome to Protected Mode";
char *VideoMem = (char*)0xB8000;
while(*Text)
{
*VideoMem = *Text;
*VideoMem++;
*VideoMem = 7;
*VideoMem++;
*Text++;
}
return(0);
}
[link.txt]
OUTPUT_FORMAT("binary")
INPUT(temp/boot.obj temp/aquanaos_kernel.obj)
ENTRY(_start)
SECTIONS
{
.text 0x10200 : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(1);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(1);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(1);
}
end = .; _end = .; __end = .;
}
Und die Befehle zum erstellen:
nasm -f aout -o temp/boot.obj boot.asm
gcc -ffreestanding -nostdinc -Wall -c -Os -o temp/aquanaos_kernel.obj aquanaos_kernel.c
ld -T link.txt -o temp/kernel.bin
Ich hoffe, ihr könnt mir helfen :(
Azi, #13 und Oberster Tempelwächter :)
-
Du solltest die Flags im Multiboot header setzen. Mindestens Bit 16 muss gesetzt sein, damit die nachfolgenden Felder genutzt werden.
siehe: http://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Header%20magic%20fields
-
Meine boot.asm sieht nun so aus:
[Bits 32]
extern _main
global _start
section .text
_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd _mbh
dd _start
dd 0x00000000
dd 0x00000000
dd _start
dd 0x00000000
dd 0x00000050
dd 0x00000019
dd 0x00000000
_start:
call _main
_stop:
jmp _stop
Nun gibt es den Error 7: Loading below 1MB not supported. Heisst das, dass ich den Kernel noch größer schreiben muss?
-
Nein, du versuchst deinen Kernel nur in den unteren 1 MB des RAMs zu laden. Das schlägt fehl, da sich da schon GRUB plaziert hat.
Lade den Kernel einfach in einen höheren (aber noch physikalisch existierenden) Speicherbereich.
Gruß,
C#ris
-
dazu musst du das 0x10200 in 0x100000 oder höher ändern.
-
Wenn ich das ändere, meldet der mir wieder den Error 13.
-
Ich hab mal etwas rumprobiert, der Fehler kommt immer dann, wenn die .text-Zeile in der link.txt eine größere Zehl steht als 0xFFFC0. Ich hoffe, das sagt euch etwas.
-
Okay, gelöst, es lag an der boot.asm
[Bits 32]
extern _main
global _start
extern code
extern _bss
extern end
_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd _mbh
dd code
dd _bss
dd end
dd code
dd 0x00000000
dd 0x00000050
dd 0x00000019
dd 0x00000000
_start:
call _main
_stop:
jmp _stop