Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bsunisol am 06. April 2006, 16:44
-
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
-
Hi
Also das hier sieht für mich nach nem Fehler aus:
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
Du erstellst dir nen Wert in AX, rufst dann putstring auf, wo der Inhalt von AX verändert wird und schreibst dann den Wert von AX in die Descriptors. Du solltest also die Textausgabe woanders machen.
-
Mal ein paar Fragen, die ihr euch hoffentlich auch gestellt habt:
Warum ändert ihr die GDT? Warum sogar 2x?
Was heisst
db 0xea
dw PMODE
dw 0x8
und warum steht da nicht
jmp 0x8:PMODE?
Warum wird irgendwo in den Bereich von 0x10000 gesprungen, wenn da gar nichts ist?
jmp 0x8:0x10000 + PMODE2
Warum befinden sich die load- und putstring-Funktionen im [BITS 32] Teil, wenn sie doch (zumindest die putstring-Funktion) aus dem BITS 16 Teil aufgerufen werden, und beide Funktionen BIOS-Interrupts nutzen, die im Protected Mode gar nicht verfügbar sind?
Mein Tipp: Sucht euch ein anderes Tutorial, das euch die Grundlagen der x86 Architektur anständig beibringt.
Edit: Oder Buch, wenn euch das lieber ist. Hier im Forum stehen sicherlich einige Hinweise dazu.
-
@darkthing:
danke - ist wohl auch klar ;) denkfehler
@porkchicken:
wir sind gerade dabei den pmode zu lernen. das haben wir alles aus dem
tee-jay tutorial. das ist sogar teilweise der quelltext von ihm.
also: no se.