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??