Autor Thema: Protected Mode Probleme  (Gelesen 15431 mal)

DarkCrow

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« am: 05. August 2004, 23:45 »
Hallo Leute,

hab ein Problem mit dem PMode!

Wenn mein Kernel geladen wird, schalte ich (im Kernel) in den Protected Mode, dies funktioniert aber nur soweit, dass ich nur bis zum laden der GDT komme und bei den Befehlen:
mov eax, cr0            ; Copy the contents of CR0 into EAX
or eax, 1               ; Set bit 0
mov cr0, eax            ; Copy the contents of EAX into CR0
Nachdem diese Befehle ausgeführt wurden, friert der Computer ein!

Hier nochmal der ganze Code:
[bits 16]
; ---------------------------------------------------------
; Unser Kernel
; ---------------------------------------------------------

mov ax, 1000h            ; Update die Segmentregister:
mov ds, ax
mov es, ax

start:

mov ax,cs
mov ds,ax

; ---------------------------------------------------------
; Registriere den Interrupt
; ---------------------------------------------------------

push dx
push es
xor ax,ax
mov es,ax
cli
mov word [es:0x80*4], _int0x80
mov [es:0x80*4+2],cs
sti
pop es
pop dx

; ---------------------------------------------------------

mov ah,02h            ; CLS
int 0x80

mov ah,01h
mov si,os_info_dlg        ;OS Infos anzeigen ...
int 0x80

mov ah,01h
mov si,bootloader_ver
int 0x80

mov ah,01h
mov si,kernel_ver
int 0x80

    ; Der Ablauf:
    ; 1. Interrupts deaktivieren
    ; 2. DS & CS zeigen auf das selbe Segment
    ; 3. eax um 4 Bits nach links verschieben um die lineare Adresse
    ;    zu erhalten.
    ; 4. Eintragen des ersten Teils der linearen Adresse
    ; 5. eax um 16 Bits nach rechts verschieben um den 2. Teil der
    ;    linearen Adresse zu erhalten.
    ; 6. Den zweiten Teil der linearen Adresse eintragen

  cli                    ; 1
  xor    ax,    ax
  mov    ds,    ax
  mov    eax,    cs            ; 2
  mov    ds,    ax            ; 2
  shl    eax,    4            ; 3
  mov    [CODE_Descriptor+2],    ax    ; 4
  mov    [DATA_Descriptor+2],    ax    ; 4
  shr    eax,    16            ; 5
  mov    [CODE_Descriptor+4],    al    ; 6
  mov    [DATA_Descriptor+4],    al    ; 6

      ; Nun errechnen wird die Basisadresse und das Limit der GDT.
      ; Um die Basisadresse zu errechnen müssen wir das CS Register
      ; nach EAX verschieben und wieder 4 Bits nach links. Nun addieren
      ; wird den Offset von NULL_Desc dazu, da dieser der Startoffset
      ; der GDT ist.
      ;
      ; Um das Limit der GDT zu errechnen, müssen wir den Startoffset
      ; vom GDT-Offset abziehen.
  mov    eax,    cs
  shl    eax,    4
  add    eax,    NULL_Descriptor
  mov    [Base],    eax
  mov    [Limit],    WORD gdt - NULL_Descriptor - 1
      ; Nun können wir das GDT Register laden.
  lgdt    [gdt]

; CLEAN !!!

      ; Nachdem wir nun das GDT Register mit den Werten geladen haben,
      ; können wir in den Protected Mode schalten ... *ENDLICH*
      ; Dazu müssen wir ...
      ; 1. CR0-Register in EAX laden
      ; 2. Das erste Bit (PE Bit [Protection Enable]) auf 1 setzen
      ;    (Sobald es auf 1 gesetzt wird, befindet sich der Prozessor
      ;     im Protected Mode. Wird das Bit gelöscht, befindet sich
      ;     der Prozessor wieder im Real Mode
      ;    ).
      ; 3. Das CR0-Register mit dem neuen Wert laden!
     
  mov eax, cr0            ; Copy the contents of CR0 into EAX
  or eax, 1               ; Set bit 0
  mov cr0, eax            ; Copy the contents of EAX into CR0

sti
mov ah,01h
mov si,debug_4
int 0x80
cli

 
      ; Nachdem nun (fast) alles geschafft ist und wir uns im PMode
      ; befinden müssen wir nur noch das CS-Register laden und den
      ; Prefetch von den alten 16Bit Befehlen leeren.
      ;
      ; Dies errechen wir mit einem FAR JUMP
  db    0xEA                ; Bitmuster eines FAR JUMPS
  dw    PMODE                ; Wohin wir springen wollen
  dw    0x8                ; Angabe des Selektors für
                      ; das Segment zu dem ge-
                      ; sprungen werden soll.

sti
mov ah,01h
mov si,debug_5
int 0x80
cli

      ; So nun haben wir es geschafft, wir befinden uns im PMode
      ; und müssen es nur noch NASM mitteilen.
    [bits 32]
PMODE:

sti
mov ah,01h
mov si,debug_6
int 0x80
cli

      ; Da wir zuvor die Segmentadresse verschoben haben, müssen
      ; wir diese nun wieder zurückstellen.
  mov    WORD [CODE_Descriptor+2],    0
  mov    WORD [DATA_Descriptor+2],    0
  mov    BYTE [CODE_Descriptor+4],    0
  mov    BYTE [DATA_Descriptor+4],    0

sti
mov ah,01h
mov si,debug_7
int 0x80
cli

  mov    ax,    2            ; Index 2 der GDT Table
  shl    ax,    3            ; Im Selektor bginnt der
                      ; Index erst ab Bit 3
  mov    ds,    ax
  mov    es,    ax
  mov    ss,    ax
  mov    eax,    0
  mov    fs,    ax            ; FS und GS auf einen NULL-
                      ; Descriptor zeigen lassen
  mov    gs,    ax

  mov    esp,    0x400000        ; Stack-Größe auf 4 MB setzen

  jmp    0x8:0x10000 + PMODE2

PMODE2:

sti
mov ah,01h
mov si,debug_7
int 0x80
cli


mov ah,01h
mov si,shutdown_dlg        ;Shutdown_dlg
int 0x80

jmp shutdown            ;shutdown

    ; ---------------------------------------------------------
    ; Variablen
    ; ----------------------------------------------------------

os_info_dlg    db    "DDos32 (Dark Disk Operation System) Infos:",13,10,0
bootloader_ver    db    "Bootloader (asm ver.): 1.0",13,10,0
kernel_ver    db    "Kernel     (asm ver.): 0.2",13,10,0
shutdown_dlg    db    13,10,"Dr",129,"cken Sie eine Taste zum herunterfahren...",13,10,0
sommerzeit    db    "z.Z. haben wir Sommerzeit",0

; DEBUG VARS
debug_1        db    "Debug 1",13,10,0
debug_2        db    "Debug 2",13,10,0
debug_3        db    "Debug 3",13,10,0
debug_4        db    "Debug 4",13,10,0
debug_5        db    "Debug 5",13,10,0
debug_6        db    "Debug 6",13,10,0
debug_7        db    "Debug 7",13,10,0

; GDT_START Descriptors

;Deskriptoren

NULL_Descriptor:
    ; Den NULL_Descriptor braucht man, um Register und aehnliches,
    ; welche nicht benutzt werden "abzulenken", damit sie keine
    ; Speicherschutzverlätzung generieren!
    ;
    ; Dazu werden 2 DWORD mit dem Wert 0 erstellt.
    dd    0
    dd    0

CODE_Descriptor:
    ; Der CODE_Descriptor ist dazu da, um den OS Code zu behandeln.
    dw      0xFFFF
    dw      0
    db      0
    db      10011010b
    db      00000000b
    db      0
   
DATA_Descriptor:
    ; Der DATA_Descriptor behandelt unsere Daten, die das OS verwaltet.
    dw      0xFFFF
    dw      0
    db      0
    db      10011010b
    db      00000000b
    db      0
   
gdt:
    ; Dies ist unsere GDT (Global Descriptor Table)
  Limit    dw    0
  Base    dd    0

; GDT_END

; ---------------------------------------------------------
; Interrupt (0x80)
; ---------------------------------------------------------

_int0x80:
    pusha

    cmp ah,0x0
    je _int0x80_ser0x00

    cmp ah,0x1
    je _int0x80_ser0x01
   
    cmp ah,0x2
    je _int0x80_ser0x02
   
    cmp ah,0x3
    je _int0x80_ser0x03
   
    jne _int0x80_end
   
    _int0x80_ser0x00:    ; routine 0x00
        mov ah,0x0E
        mov al,dl
        int 10h
        jmp _int0x80_end
   
    _int0x80_ser0x01:
        lodsb
        or al,al
        jz _int0x80_ser0x01_end
        mov ah,0x0E
        int 10h
        jmp _int0x80_ser0x01

        _int0x80_ser0x01_end:
        jmp _int0x80_end
       
    _int0x80_ser0x02:
        xor al,al
        xor cx,cx
        mov dh,25
        mov dl,80
        mov bh,7
        mov ah,6
        int 010h
        mov bh,0
        mov ah,3
        int 010h
        mov dx,0
        mov ah,2
        int 010h
        jmp _int0x80_end
   
    _int0x80_ser0x03:
        mov ah,0
        int 016h
        jmp _int0x80_end

    _int0x80_end:
    popa
    iret

; ---------------------------------------------------------

shutdown:
    mov AX,0x5300
    XOR BX,BX
    INT 15h ; APM install check
    MOV AX,0x5304
    XOR BX, BX
    INT 15h ; disconnect interface
    MOV AX,0x5301
    XOR BX, BX
    INT 15h ; connect real-mode interface
    MOV AX,0x5307
    MOV BX,1
    MOV CX,3
    INT 15h ; powerdown system
(Bis zum Kommentar "CLEAN !!!" läuft alles)

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #1 am: 06. August 2004, 00:18 »
Ich denke es liegt am Interrupt nach dem du die GDT initiallisiert hast benutzt du deinen RMODe Interrupt um was auzugeben das funktioniert nicht. Du must den Interrupt inne IDT eintragen. und mit lidt die IDT laden.
Sowie es jetzt is zeigt int 0x80 ins Nirvana da du keine IDT hast, Int 0x80 ist halt nur für den RMode gültig.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

DarkCrow

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 06. August 2004, 01:40 »
auch, wenn ich versuche, ohne Interrupts zu arbeiten blockiert er ...

hab langsam keine Ideen mehr :-(

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #3 am: 06. August 2004, 10:43 »
Dazu sage ich nur -> Bochs-Debug-Modus :)
----------------------
Redakteur bei LowLevel

DarkCrow

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. August 2004, 12:14 »
Gut, das Problem habe ich nun gelöst, aber jetzt hab ich noch ne Frage ...

wenn ich mit dem Programm MeregeKernel die beiden Dateien (wie im Tutorial C-Kernel starten) beschrieben ist zusammen-"mache" passiert nichts, auch wenn ich in meinem 16bit Kernel ans Dateiende ein Label z.B. start_ckernel hänge und dort hinspringe ... woran könnte das liegen?

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #5 am: 06. August 2004, 12:39 »
Hellsehen kann ich leider "noch" nicht.....daran arbeite ich noch ;)

Du musst uns schon ein bissl mehr geben als einfach nur "es geht nit".....damit kann wohl keiner was anfangen :)
----------------------
Redakteur bei LowLevel

DarkCrow

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. August 2004, 12:46 »
ich meine damit, dass nur ein Kursor hecktisch auf dem Bildschirm blinkt und sonst nichts!

Kein "Welcome to Protected Mode" kein gar nichts ...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #7 am: 06. August 2004, 13:05 »
Ach übrigens ich wollte letzens auch dein mergekernel tool laden, aber irgndwie wenn ich das versuche sind in dem zip nur 2 datein die kernel 16 und das desccalc sonst nix, entweder du asht den rest geklaut oder auf meim rechner isn fehler:P
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #8 am: 06. August 2004, 13:56 »
liegt vielleicht daran das die Kernel16 keine feste größe hat
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

 

Einloggen