Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet 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
-
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.
-
Danke würde es auch mit dem WinPE oder wie das heißt gehen wenn ja wie kompiliere ich den Kernel dann?
-
Danke würde es auch mit dem WinPE oder wie das heißt gehen
afaik nein.
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.
-
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
-
Hallooooooo????
-
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.
-
Mein Problem ist das ich nicht weiß wie das in Assembler geht.
Ich hab nur C Beispiele gefunden.
-
[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.
-
Danke hat funktioniert
Mfg
Darkmonkey
-
Hat das so ohne Anpassungen funktioniert? Ich bin irgendwie überrascht :-o
-
Ja habs nur reinkopiert!