Help! I can't enter PMode
Posted: Sun Jul 18, 2004 9:22 pm
Hi,everyone. I am very confused that I cannot enter the Pmode, and when i use boches to debug, the limit of GDT could not be loaded. Could anyone help me?
[bits 16]
[org 0x9000]
jmp Begin
gdtr: dw gdt_end - gdt - 1 ; GDT limit
dd gdt ; linear, physical
; address of GDT
;------------GDT Table---------------;
; null descriptor
gdt: dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; type
db 0 ; limit 19:16, flags
db 0 ; base 31:24
; linear data segment descriptor
LINEAR_SEL equ $-gdt
dw 0xFFFF ; limit 0xFFFFF
dw 0 ; base 0
db 0
db 0x92 ; present, ring 0, data,
; expand-up, writable
db 0xCF ; page-granular, 32-bit
db 0
; code segment descriptor
SYS_CODE_SEL equ $-gdt
gdt2: dw 0xFFFF ; limit 0xFFFFF
dw 0 ; (base gets set above)
db 0
db 0x9A ; present, ring 0, code,
; non-conforming,
; readable
db 0xCF ; page-granular, 32-bit
db 0
; data segment descriptor
SYS_DATA_SEL equ $-gdt
gdt3: dw 0xFFFF ; limit 0xFFFFF
dw 0 ; (base gets set above)
db 0
db 0x92 ; present, ring 0, data,
; expand-up, writable
db 0xCF ; page-granular, 32-bit
db 0
gdt_end:
;----------End GDT Table-------------;
Begin:
cli
xor ebx,ebx
mov bx,cs ; BX=segment
shl ebx,4 ; EBX=linear
; address of
; segment base
mov eax,ebx
mov [gdt2 + 2],ax ; set base
; address of 32-
; bit segments
mov [gdt3 + 2],ax
shr eax,16
mov [gdt2 + 4],al
mov [gdt3 + 4],al
mov [gdt2 + 7],ah
mov [gdt3 + 7],ah
lea eax,[gdt + ebx] ; EAX=PHYSICAL
;address of gdt
mov [gdtr + 2],eax
lgdt [gdtr] ;load GDT to GDTR
;Enter PMode
mov eax,cr0
inc ax
mov cr0,eax
jmp dword SYS_CODE_SEL:FLUSH
[bits 32]
FLUSH:
mov ax,LINEAR_SEL
mov es,ax
mov byte [es:dword 0xB8008],'5' ;Indicate that
; now I am in
; the PMode
hlt
[bits 16]
[org 0x9000]
jmp Begin
gdtr: dw gdt_end - gdt - 1 ; GDT limit
dd gdt ; linear, physical
; address of GDT
;------------GDT Table---------------;
; null descriptor
gdt: dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; type
db 0 ; limit 19:16, flags
db 0 ; base 31:24
; linear data segment descriptor
LINEAR_SEL equ $-gdt
dw 0xFFFF ; limit 0xFFFFF
dw 0 ; base 0
db 0
db 0x92 ; present, ring 0, data,
; expand-up, writable
db 0xCF ; page-granular, 32-bit
db 0
; code segment descriptor
SYS_CODE_SEL equ $-gdt
gdt2: dw 0xFFFF ; limit 0xFFFFF
dw 0 ; (base gets set above)
db 0
db 0x9A ; present, ring 0, code,
; non-conforming,
; readable
db 0xCF ; page-granular, 32-bit
db 0
; data segment descriptor
SYS_DATA_SEL equ $-gdt
gdt3: dw 0xFFFF ; limit 0xFFFFF
dw 0 ; (base gets set above)
db 0
db 0x92 ; present, ring 0, data,
; expand-up, writable
db 0xCF ; page-granular, 32-bit
db 0
gdt_end:
;----------End GDT Table-------------;
Begin:
cli
xor ebx,ebx
mov bx,cs ; BX=segment
shl ebx,4 ; EBX=linear
; address of
; segment base
mov eax,ebx
mov [gdt2 + 2],ax ; set base
; address of 32-
; bit segments
mov [gdt3 + 2],ax
shr eax,16
mov [gdt2 + 4],al
mov [gdt3 + 4],al
mov [gdt2 + 7],ah
mov [gdt3 + 7],ah
lea eax,[gdt + ebx] ; EAX=PHYSICAL
;address of gdt
mov [gdtr + 2],eax
lgdt [gdtr] ;load GDT to GDTR
;Enter PMode
mov eax,cr0
inc ax
mov cr0,eax
jmp dword SYS_CODE_SEL:FLUSH
[bits 32]
FLUSH:
mov ax,LINEAR_SEL
mov es,ax
mov byte [es:dword 0xB8008],'5' ;Indicate that
; now I am in
; the PMode
hlt