Autor Thema: GRUB + Assembler Kernel  (Gelesen 5882 mal)

Darkmonkey

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« am: 02. January 2008, 18:07 »
Hallo,

Ich möchte meinen Kernel in Assembler schreiben und als Bootloader GRUB benutzen.
Als Test ob Grub meinen Kernel überhaupt ladet hab ich aus einem Tutorial diesen Code mit dem Multibootheader

[BITS 32]

GLOBAL start

jmp start

MULTIBOOT_PAGE_ALIGN   equ 1<<0
MULTIBOOT_MEMORY_INFO  equ 1<<1

MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd CHECKSUM

start:
push 0
popf

push eax
push ebx

main:
               ; war aufruf von main funktion aus C Kernel
jmp $

Grub gibt nun den Fehler aus:
Error 13: Invalid or unsupported executabel format

Hab ich im Code irgend einen Fehler bzw. Ich hab den Kernel mit NASM als BIN Datei kompiliert ist das Falsch.
Brauch ich einen PE Header wenn ja wie gehts mit WinPE?

Mfg Darkmonkey
« Letzte Änderung: 02. January 2008, 18:57 von Darkmonkey »

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 02. January 2008, 18:12 »
Wenn du bin als Format nutzen willst musst du grub afaik noch ein bisschen mehr an information in der Multibootheader zukommen lassen. Schau dir dazu mal die unter "3.1.3 The address fields of Multiboot header" in der  Multiboot Specification beschrieben Felder an.

Grub könnte aber elf von Haus aus ohne diese zusätzlichen Felder laden.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Darkmonkey

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 02. January 2008, 18:56 »
Danke würde es auch mit dem WinPE oder wie das heißt gehen wenn ja wie kompiliere ich den Kernel dann?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 02. January 2008, 19:05 »
Danke würde es auch mit dem WinPE oder wie das heißt gehen
afaik nein.

Zitat
wenn ja wie kompiliere ich den Kernel dann?
nasm mit dem Kommandozeilenparameter "-f win32". Evtl. muss man das noch linken, aber da bin ich mir nicht sicher.

edit: Das grub manual meint a.out wäre unterstützt ("Support many of the a.out variants plus ELF.").
edit2: Kommandozeilenparameter "-f aout" für aout ;-) . "nasm -hf" zeigt dir alle unterstützten Formate an.
« Letzte Änderung: 02. January 2008, 19:09 von bluecode »
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Darkmonkey

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 02. January 2008, 19:46 »
Danke ich hab im Forum etwas rumgesucht und diesen Multibootheader gefunden.

[Bits 32]
;extern _main
global _start
;extern code
;extern _bss
;extern end

_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd 0x00000000
dd 0x00000050
dd 0x00000019
dd 0x00000000
_start:
;call _main
_stop:
jmp _stop

Jetzt kommt nicht mehr der Fehler #13 sondern das ich den Kernel irgendwo bei 1 MB reinkopieren will das ist aber schon von Grub belegt wie ändere ich das in Assembler?

Ich hoff es kann mir jemand helfen ich werd nämlich bald verrückt  :-P
« Letzte Änderung: 02. January 2008, 23:19 von Darkmonkey »

Darkmonkey

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 03. January 2008, 19:50 »
Hallooooooo????

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 03. January 2008, 20:17 »
Bei 1 MB wäre ok. Was GRUB nicht kann, ist den Kernel unterhalb von 1 MB zu laden. Du mußt also dafür sorgen, daß der Kernel z.B. an 0x100000 liegt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Darkmonkey

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 03. January 2008, 23:11 »
Mein Problem ist das ich nicht weiß wie das in Assembler geht.
Ich hab nur C Beispiele gefunden.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 04. January 2008, 00:06 »
[Bits 32]
;extern _main
global _start

_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd 0x00100000 + _mbh ; physische Adresse an die die Multiboot Header geladen werden soll
dd 0x00100000 ; physische Adresse an die geladen wird, physisch 1MB
dd 0x00100000 + _end ; physische Adresse des Endes des Code & Datenteils
dd 0x00100000 + _end ; physische Adresse des Endes des BSS-Teils (momentan überhaupt kein BSS teil)
        dd    0x00100000 + _start ; Entry-Point

_start:
;call _main
_stop:
jmp _stop
_end:

So könnte das evtl. funktionieren. Ich habe es aber nicht versucht.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Darkmonkey

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 06. January 2008, 15:33 »
Danke hat funktioniert

Mfg
Darkmonkey

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #10 am: 06. January 2008, 15:47 »
Hat das so ohne Anpassungen funktioniert? Ich bin irgendwie überrascht :-o
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Darkmonkey

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 09. January 2008, 20:13 »
Ja habs nur reinkopiert!

 

Einloggen