Hi OS-Coder,
hab jetzt mal mein OS, wenn man das so nennen kann, so umgeschrieben, dass es im PM starten sollte. Dazu hab ich den Bootloader aus Lowlevel Ausgabe 1 genommen, ein paar unnötige Dinge entfernt und den kurzen PMode-Code von Stefan Marcik verwendet, dann beides kombiniert.
Jedoch wird jetzt gar keine Meldung mehr ausgegeben.
Könnt ihr mir sagen, wo der Fehler im Bootloader liegt ?
Bootcode:
[BITS 16]
ORG 0x7C00 ;Startadresse
start:
cli ;Keine Interrupts!
mov [bootdrv],dl ;Bootlaufwerk aus DL speichern
call load ;Lade unseren Kernel
lgdt [gdtr]
mov eax,cr0
or al,1
mov cr0,eax
jmp codesel:PMode
;Springe zu diesem Kernel
mov ax,0x1000 ;Die Adresse des Programms
mov es,ax ;Segmentregister updaten
mov ds,ax
push ax
mov ax,0
push ax
retf
[BITS 32]
PMode:
mov ax,datasel
mov ds,ax
mov ss,ax
mov esp,0x90000
jmp $
gdtr:
dw gdt_end-gdt-1
dd gdt
gdt:
dd 0,0
codesel equ $-gdt
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00
datasel equ $-gdt
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00
gdt_end:
;--------------------------
;Funktionen und Variablen
;--------------------------
bootdrv db 0
loadmsg db "Loading...",13,10,0
;Einen String ausgeben:
putstr:
lodsb ;Byte laden
or al,al
jz short putstrd ;0-Byte? -> Ende!
mov ah,0x0E ;Funktion 0x0E
mov bx,0x0007 ;Attribut-Byte (wird nicht bentigt)
int 0x10 ;schreiben
jmp putstr ;Nchstes Byte
putstrd:
retn
;Lade den Kernel vom Bootlaufwerk
load:
;Diskdrive reset (Interrupt 13h, 0)
push ds ;Sichere DS
mov ax,0 ;Die gewnschte Funktion (reset)
mov dl,[bootdrv] ;Dieses Laufwerk ist gewnscht
int 13h ;den Interrupt ausfhren
pop ds ;DS wiederherstellen
jc load ;Geht nicht? -> Nochmal!
load1:
mov ax,0x1000 ;ES:BX=10000
mov es,ax
mov bx,0
;Sektoren lesen (Interrupt 13h, 2)
mov ah,2 ;Funktion 2 (Lesen)
mov al,5 ;Lese 5 Sektoren
mov cx,2 ;Zylinder=0, Sektor=2
mov dx,0 ;Kopf=0, Laufwerk=0
int 13h ;ES:BX=Daten vom Laufwerk
jc load1 ;Fehler? Nochmal!
mov si,loadmsg
call putstr ;Meldung ausgeben
retn
times 512-($-$$)-2 db 0 ;Dateilnge: 512 Bytes
dw 0AA55h ;Bootsignatur
Ich schätz mal, dass der Fehler bei dem jmp $ liegt, jedoch hab ich
keine Ahnung, wo ich sonst hinspringen soll.
Beim gdt_end hat im Code ein Doppelpunkt gefehlt, oder ?
(Da sonst von NASM eine Fehlermeldung "Label alone" erscheint)
Kernel-Code
mov ax,1000h ;Segmentregister updaten
mov ds,ax
mov es,ax
START:
;--------------------------
;Funktionen und Variablen
;--------------------------
mov BYTE [DS:0B8000h],'P' ;Leuchtendes P ausgeben
mov BYTE [DS:0B8001h],1Bh
Traumszenario:
Der Bootloader ladet den Kernel, ähnlich wie in Lowlevel-Ausgabe 1, der Kernel gibt lediglich ein P aus, um zu zeigen, dass der Vorgang erfolgreich war.
Vielen Dank im Vorraus