- 論壇徽章:
- 0
|
開啟了,問題依舊。新的代碼如下:
如果PAGE_DIR_ADDR=0x0,則運(yùn)行正常;如果改為0x00100000,則在JMP $時,重啟
;存儲段描述符類型值說明
;----------------------------------------------------------------------------
ATDR equ 90h ;存在的只讀數(shù)據(jù)段類型值
ATDW equ 92h ;存在的可讀寫數(shù)據(jù)段屬性值
ATDWA equ 93h ;存在的已訪問可讀寫數(shù)據(jù)段類型值
ATCE equ 98h ;存在的只執(zhí)行代碼段屬性值
ATCER equ 9ah ;存在的可執(zhí)行可讀代碼段屬性值
ATCCO equ 9ch ;存在的只執(zhí)行一致代碼段屬性值
ATCCOR equ 9eh ;存在的可執(zhí)行可讀一致代碼段屬性值
;----------------------------------------------------------------------------
;其它常量值說明
;----------------------------------------------------------------------------
GL equ 80h ;段界限以4K為單位標(biāo)志
;----------------------------------------------------------------------------
;分頁機(jī)制使用的常量說明
;----------------------------------------------------------------------------
PL equ 1 ;頁存在屬性位
RWR equ 0 ;R/W屬性位值,讀/執(zhí)行
RWW equ 2 ;R/W屬性位值,讀/寫/執(zhí)行
USS equ 0 ;U/S屬性位值,系統(tǒng)級
USU equ 4 ;U/S屬性位值,用戶級
PAGE_DIR_ADDR equ 0x00100000 ;U/S屬性位值,用戶級
segment a
desc_null:
dw 0;Segment Limite
dw 0;Segment Base(15...0)
db 0;Segment Base(23...16)
db 0;Attributes(m+5)[P DPL DT1 TYPE]
db 0;Attributes(m+6)[G D 0 AVL Limit(19...16)]
db 0;Base(31...24)
desc_code:
dw a_end;Segment Limite
dw 0;Segment Base(15...0)
db 0;Segment Base(23...16)
db ATCER;Attributes(m+5)[P DPL DT1 TYPE]
db 0;Attributes(m+6)[G D 0 AVL Limit(19...16)]
db 0;Base(31...24)
desc_data:
dw a_end;Segment Limite
dw 0;Segment Base(15...0)
db 0;Segment Base(23...16)
db ATDWA;Attributes(m+5)[P DPL DT1 TYPE]
db 0;Attributes(m+6)[G D 0 AVL Limit(19...16)]
db 0;Base(31...24)
desc_line:
dw 0xffff;Segment Limite
dw 0;Segment Base(15...0)
db 0;Segment Base(23...16)
db ATDWA;Attributes(m+5)[P DPL DT1 TYPE]
db 0xf + GL;Attributes(m+6)[G D 0 AVL Limit(19...16)]
db 0;Base(31...24)
sel_code equ desc_code - desc_null
sel_data equ desc_data - desc_null
sel_line equ desc_line - desc_null
vgdt:
dw 0xffff
dd 0
..start:
mov ax,a
mov ds,ax
mov bx,16
mul bx
mov [desc_code + 2],ax
mov [desc_data + 2],ax
mov [desc_code + 4],dl
mov [desc_data + 4],dl
mov [desc_code + 7],dh
mov [desc_data + 7],dh
mov [vgdt + 2],ax
mov [vgdt + 4],dx
;打開A20地址線
push ax
in al,92h
or al,00000010b
out 92h,al
pop ax
cli
lgdt [vgdt]
mov eax,cr0
or eax,1
mov cr0,eax
jmp sel_code:do
real:
mov ax,4c00h
int 21h
do:
;初始化頁目錄表
mov ax,sel_line
mov es,ax
;初始化兩個頁目錄表
mov dword[es:dword PAGE_DIR_ADDR],PAGE_DIR_ADDR + 0x00001000 +USU+RWW+PL
;初始化第一個頁目錄表項的頁表項
mov ax,sel_line
mov es,ax
mov edi,0x00101000
mov cx,1024
xor eax,eax
or eax,USU+RWW+PL
loop1: stosd
add eax,0x1000
loop loop1
;切換
mov eax,PAGE_DIR_ADDR
mov cr3,eax
mov eax,cr0
or eax,80000000h
mov cr0,eax
jmp $
a_end: |
|