Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Darkmonkey am 02. January 2008, 18:07

Titel: GRUB + Assembler Kernel
Beitrag von: Darkmonkey 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
Titel: Re: GRUB + Assembler Kernel
Beitrag von: bluecode 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 (http://www.gnu.org/software/grub/manual/multiboot/multiboot.html) beschrieben Felder an.

Grub könnte aber elf von Haus aus ohne diese zusätzlichen Felder laden.
Titel: Re: GRUB + Assembler Kernel
Beitrag von: Darkmonkey 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?
Titel: Re: GRUB + Assembler Kernel
Beitrag von: bluecode 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.
Titel: Re: GRUB + Assembler Kernel
Beitrag von: Darkmonkey 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
Titel: Re: GRUB + Assembler Kernel
Beitrag von: Darkmonkey am 03. January 2008, 19:50
Hallooooooo????
Titel: Re: GRUB + Assembler Kernel
Beitrag von: kevin 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.
Titel: Re: GRUB + Assembler Kernel
Beitrag von: Darkmonkey am 03. January 2008, 23:11
Mein Problem ist das ich nicht weiß wie das in Assembler geht.
Ich hab nur C Beispiele gefunden.
Titel: Re: GRUB + Assembler Kernel
Beitrag von: bluecode 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.
Titel: Re: GRUB + Assembler Kernel
Beitrag von: Darkmonkey am 06. January 2008, 15:33
Danke hat funktioniert

Mfg
Darkmonkey
Titel: Re: GRUB + Assembler Kernel
Beitrag von: bluecode am 06. January 2008, 15:47
Hat das so ohne Anpassungen funktioniert? Ich bin irgendwie überrascht :-o
Titel: Re: GRUB + Assembler Kernel
Beitrag von: Darkmonkey am 09. January 2008, 20:13
Ja habs nur reinkopiert!