Autor Thema: Komisches PM Problem  (Gelesen 4466 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 02. June 2007, 10:54 »
Ich überarbeite gerade meinen Kernel; Allerdings gibt es jetzt probleme mit dem Wechsel in den PM.

code:
[Bits 16]
[org 0x2000]

;...

GDT_START:

  gdt_NULL:
      dd 0
      dd 0

   
  gdt_CODE:
     dw 0xFFFF
     dw 0
     db 0
     db 10011010b ; 0x9A
     db 11001111b ; 0xCF
     db 0

  gdt_DATA:
     dw 0xFFFF
     dw 0
     db 0
     db 10010010b ; 0x92
     db 11001111b ; 0xCF
     db 0

  gdt_VRAM:
     dw 0x0F9F
     dw 0x8000
     db 0x0B
     db 10010010b ; 0x92
     db 00000000b ; 0x00
     db 0x00

GDT_END:

GDT_DESC:
   limit dw GDT_END - GDT_START - 1
   base  dd GDT_START


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Selectoren                         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

nullsel  equ 000000000000000b
codesel  equ 000000000001000b
datasel  equ 000000000010000b
vramsel  equ 000000000011000b


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PMode                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

EnablePMode:
   PM0:
    cli
    lgdt [GDT_DESC] ; GDT laden
   
   PM1:
    mov eax, cr0 ; Das CR0 Register in eax laden
    or  eax, 1   ; Das 0. Bit (PE Bit) auf 1 setzen
    mov cr0, eax ; Den neuen Wert in CR0 laden

   
    jmp long codesel:PM2+0x10000  ;#Hier wird rebootet#

[Bits 32]
   PM2:
    jmp PM2

Debuginformationen (von mir (ein echter PC))
16 Bit Kernel

cs: 0x00001000
ds: 0x00001000

PM-Wechsel:

limit: 0x0000001F
base:  0x00002107
GDT@:  0x00002107 bis 0x00002127
desc@: 0x00002127
PMen@: 0x000021BC

lgdt [OK]
pmen [OK]

cr0:   0x00000011
j2PM@: 0x000021FB

#Hier wird rebootet#

Debuginformationen (von Bochs)
00003425503e[CPU0 ] jump_protected: gate type 0 unsupported
00003425503e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
...
00004191636i[CPU0 ] real mode
00004191636i[CPU0 ] CS.d_b = 16 bit
00004191636i[CPU0 ] SS.d_b = 16 bit
00004191636i[CPU0 ] | EAX=ffff040a  EBX=0000ce3c  ECX=000a0004  EDX=00000402
00004191636i[CPU0 ] | ESP=0000ff5e  EBP=0000ff62  ESI=0000733c  EDI=00007362
00004191636i[CPU0 ] | IOPL=0 NV UP DI PL ZR NA PE NC
00004191636i[CPU0 ] | SEG selector     base    limit G D
00004191636i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00004191636i[CPU0 ] |  CS:f000( 0000| 0|  0) 000f0000 0000ffff 0 0
00004191636i[CPU0 ] |  DS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00004191636i[CPU0 ] |  SS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00004191636i[CPU0 ] |  ES:07c0( 0000| 0|  0) 00007c00 0000ffff 0 0
00004191636i[CPU0 ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00004191636i[CPU0 ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00004191636i[CPU0 ] | EIP=00000542 (00000541)
00004191636i[CPU0 ] | CR0=0x00000010 CR1=0 CR2=0x00000000
00004191636i[CPU0 ] | CR3=0x00000000 CR4=0x00000000

Komisch ist schon, das bochs noch im 16Bit modus zu sein scheint...
Der code hat so früher mal funktioniert, allerdings liegt er nun an einer Andern Positiom im speicher... Das habe ich aber eigentlich korrigiert, und de Debuginfos sind auch alle OK

Was ist falsch?? Wo muss ich den Fehler suchen??

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #1 am: 04. June 2007, 10:35 »
sry für diese Blöde frage  :oops:

habe in diesem Abschnitt ...
GDT_DESC:
   limit dw GDT_END - GDT_START - 1
   base  dd GDT_START
...vergessen das Codesegment auf GDT_START zu addieren  :-P

 

Einloggen