C Kernel aus ASM Bootloader aufrufen

Hi,

ich habe einen mehr als kleinen primitiven ASM Bootloader geschrieben

Code:
[BITS 16]     
[ORG 0x7C00]

main:
		mov ax,0x0000
		mov ds,ax
		mov si, os_string
		call load_os
		jmp $

; Output : Loading ChaOS
load_os:
		mov ah, 0x0E
		mov bh, 0x00
		mov bl, 0x07
	
	.nextchar
		lodsb
		or al,al
		jz .return
		int 0x10
		jmp .nextchar
		.return
		ret

os_string   db 'Loading operating system',13,10,0

times 510-($-$$) db 0	
dw 0xAA55

Er gibt halt erstmal was aus. Ich würde nun gerne aus diesem Bootloader einen Kernel starten, der in C geschrieben ist.

Ich habe mal den von osdever [HIER] genommen, er sieht wie folgt aus :

Code:
[BITS 32]
[global start]
[extern _k_main] ; this is in the c file

start:
  call _k_main

  cli  ; stop interrupts
  hlt ; halt the CPU

Code:
k_main() // like main in a normal C program
{
	k_clear_screen();
	k_printf("Hi!\nHow's this for a starter OS?", 0);
};


Nun steht im Tutorial :

The kernel is called kernel.bin and is ready to be run by a bootsector/loader that sets up Protected Mode and enables the A20(John Fine's bootf02 bootsector does this).

Wie bekomme ich dies nun hin ?
 
Da du deinen Bootloader kaum gegen deinen Kernel linken kannst, musst du die dedizierte Startadresse direkt anspringen.
 
Du musst den Kernel erstmal laden.
Im bootloader also der int 0x13 (wenn ich mich nicht irre) die Sektoren laden, in dem der Kernel liegt (z.B. 1,2,3,...), und an die Adresse kopieren die im linker-skript angegeben wurde z.B. 0x1000:0x0000

also:
kernel kompilieren
kernel nach $adresse linken
im bootloader sektor x,y,z,.. an $adresse kopieren
ein call nach $adresse aufrufen

ps.: Hier gibts zahlreiche informationen zum Thema, u.a. eine Schritt für Schritt - anleitung vom bootsektor bis zum HelloWorld im 32-Bit C-Kernel
 
Das hilft mir weiter.

Danke

Nachtrag

Hat mir doch noch nicht soo ganz geholfen. Die Internetseite kenne ich ( siehe Link im ersten Posting ) und ich habe auch mal das C-Kernel Dokument gelesen, jedoch will es nicht soo ganz laufen, so ist auch sein link.ld nicht ganz korrekt, weil er z.B. paar Sachen linken will die im zip gar nicht enthalten sind.

Hier mal linker Skript ( was vermutlich falsch ist )

OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
.text 0x200 : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(1);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(1);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(1);
}
end = .; _end = .; __end = .;
}


Noch etwas, wieso bekomme ich keine Ausgabe, wenn ich statt [BITS 16] [BITS 32] im ASM Code stehen habe ?
 
Hast du dem Kompiler auch alle nötigen argumente mitgegeben, z.B. dass er keine std-libs verwenden soll und son zeug??
So spontan sieht der linker-script gut aus
ps.: du musst den kernel dann nach 0x0000:0x0200 laden (wenn 16 Bit). Dass dürfte aber probleme mit dem verursache, da dort soweit ich weiß bereits relevanmte daten für das BIOS liegen

Original von Dawen
[...]
Noch etwas, wieso bekomme ich keine Ausgabe, wenn ich statt [BITS 16] [BITS 32] im ASM Code stehen habe ?

Diesem satz nach zu urteilen bist du dir nicht über die unterschiede zwischen dem 16-Bit modus (real-mode) und dem 32-Bit - modus (Protected mode) bewusst.

RM / PM
Wechsel in den PM

Wenn du diese beiden Seiten (vorallem die 2.) durchgearbeitet hast, sollten alle Fragen beantwortet sein.

ps.: Eigentlich hasse ich solche antworten, wo man auf eine seite mit 1000 Zeilen text verwiesen wird, aber in diesem fall gibts eigentlich keine alternative.
sorry
 
Zurück
Oben