Autor Thema: GRUB: Error 13: Invalid or unsupported format  (Gelesen 4458 mal)

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« 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 :)

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 06. June 2006, 17:13 »
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
Dieser Text wird unter jedem Beitrag angezeigt.

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 06. June 2006, 17:37 »
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?

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

C#ris

  • Beiträge: 47
    • Profil anzeigen
    • http://www.xerxys.org
Gespeichert
« Antwort #3 am: 06. June 2006, 18:13 »
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. June 2006, 18:20 »
dazu musst du das 0x10200  in 0x100000 oder höher ändern.
Dieser Text wird unter jedem Beitrag angezeigt.

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 06. June 2006, 18:50 »
Wenn ich das ändere, meldet der mir wieder den Error 13.

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. June 2006, 19:53 »
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.

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. June 2006, 22:01 »
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

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

 

Einloggen