Autor Thema: bootloader geht nicht...  (Gelesen 4271 mal)

bsunisol

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« 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

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 06. April 2006, 16:50 »
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.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 06. April 2006, 17:01 »
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.
Dieser Text wird unter jedem Beitrag angezeigt.

bsunisol

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 06. April 2006, 17:24 »
@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.

 

Einloggen