hi,
ich habe mit nem kumpel nen bootloader geschrieben. nun wollen wir den pmode starten. aber der rechner bootet einfach neu. hier ist einfach mal der quelltext. vom bootloader und dem kernel.
weiß einer von euch woran das lienge könnte?
bootloader:[ORG 0x7C00] ; startadresse für den Bootloader. Vom Bios vorgeschrieben
jmp start
NULL_Desc:
dd 0
dd 0
CODE_Desc:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0
DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0
db 0x92
db 0xCF
db 0
gdt:
Limit dw 0
Base dd 0
start:
; stack generieren
cli ; Verbiete Interrupts
mov ax, 0x9000
mov ss, ax ; SS = 9000 (unser Stack)
mov sp, 0 ; SP = 0000 (Stackpointer) [Anfang vom Stack]
mov eax, cs
mov es, ax
shl eax, 4
sti
mov si, pmode
call putstring
mov [CODE_Desc+2], ax
mov [DATA_Desc+2], ax
shr eax, 4
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al
mov eax, cs
shl eax, 4
add eax, NULL_Desc
mov [Base], eax
mov [Limit], WORD gdt - NULL_Desc - 1
lgdt [gdt]
mov eax, cr0
or eax, 1
mov cr0, eax
db 0xea
dw PMODE
dw 0x8
[BITS 32]
PMODE:
mov WORD [CODE_Desc+2], 0
mov WORD [DATA_Desc+2], 0
mov BYTE [CODE_Desc+4], 0
mov BYTE [DATA_Desc+4], 0
mov eax, 2
shl eax, 3
mov ds, ax
mov ss, ax
mov es, ax
mov eax, 0
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF
jmp 0x8:0x10000 + PMODE2
PMODE2:
mov si, done
call putstring
jmp LOAD_KERNEL
LOAD_KERNEL:
; Bootlaufwerk aus DL speichern
mov [bootdrv], dl
; kernel laden
call load
; zu kernel springen
mov ax, 0x1000 ; Die startadresse vom Programm
mov es, ax ; Segmentregister updaten
mov ds, ax
push ax ; in den stack
mov ax, 0
push ax ; in den stack
retf
bootdrv db 0
msg db "Loading Kernel ", 0
pmode db "Setting up PMode ", 0
done db "[Done]", 13, 10, 0
load:
; Laufwerk an den start zurück setzen (INT 13h, 0)
mov si, msg
call putstring
push ds ; DS in den Stack
mov ax, 0
mov dl, [bootdrv] ; ermitteltes Bootlaufwerk benutzen
int 13h
pop ds ; DS wieder herstelln aus dem Stack
jc load ; wenn fehler retry
load_sub:
mov ax, 0x1000 ; ES:BX = 0x1000
mov es, ax
mov bx, 0
; sektoren lesen (INT 13h, 2)
mov ah, 2 ; Funktion 2 -> Lesen
mov al, 5 ; 5 Sektoren lesen
mov cx, 2 ; Cylinder 0, Sektor 2
mov dx, 0 ; Head 0, Laufwerk 0
int 13h ; Daten vom Laufwerklesen
jc load_sub ; wenn fehler retry
mov si, done
call putstring
retn
putstring:
lodsb ; Singlebyte lesen
or al, al
jz short putstring_end ; 0-Byte (CHR(0)) dann stringende
mov ah, 0x0E ; Funktion 0E
mov bx, 0x0007 ; Attribute-Byte (wird nicht benötigt)
int 10h ; BIOS-Programm 10 aufrufen (Bildschirmausgabe)
jmp putstring ; nächstes Byte
putstring_end:
retn
times 512-($-$$)-2 db 0 ; Dateilänge: 512 Bytes
dw 0xAA55 ; Bootsignatur
kernel:[BITS 32]
mov si, text
call putstr
_LOOP:
jmp _LOOP
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
text db "> Now operating in 32 bit PMode.", 13 ,10, "> If you can see this, it's done.", 13, 10, 0