I read a book,it said the priviledge level of data segment
should be equal to 0 before return to R-mode from P-mode,but
in my codes the DPL is equal to 3 and RPL is equal to 2,
and it run very well,I want to know:
(1)Is the priviledge level of data segment DPL or RPL? or other?
(2)why does it run well?is the opinoino of book error?
Look:
;Define a data segment in GDT
dseg segment use16
gdt label byte
dummy descriptor <>
datas descriptor <0ffffh,8000h,0bh,0F2h,0> ;DPL=3
datas_sel =datas-gdt+3
.....
dseg ends
;Code segment
cseg segment use16
assume cs:cseg, ds:dseg
start:
.....
;jump into P-mode
virtual: ;P-Mode
mov ax,datas_sel
mov ds,ax
....
;return to R-mode
....
real: ;R-Mode
....
sti
mov ax,4c00h
int 21h
cseg ends
end start
maybe i am wrong, but i do not see where you have actually jumped to protected mode
Sorry,my codes are brief,I write main part,look:
jump macro selector,offsetv
db 0eah
dw offsetv
dw selector
endm
.386
;Define a data segment in GDT
dseg segment use16
gdt label byte
dummy descriptor <>
datas descriptor <0ffffh,8000h,0bh,0F2h,0> ;DPL=3
datas_sel =datas-gdt+2
.....
dseg ends
;Code segment
cseg segment use16
assume cs:cseg, ds:dseg
start:
.....
;To initialize code segment
lgdt fword ptr vgdtr
;
cli
mov eax,cr0
or eax,1
mov cr0,eax
;
jump <code_sel>,<offset virtual>
virtual: ;P-Mode
mov ax,datas_sel
mov ds,ax
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax
jump <seg real>,<offset real>
real: ;R-Mode
sti
mov ax,4c00h
int 21h
cseg ends
end start