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:
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
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
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:
Code: [Auswählen]
[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
Code: [Auswählen]
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

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken
Gespeichert



. Mit