pmtest8.asm中的PSwitch代码的理解
; 切换页表 ------------------------------------------------------------------
PSwitch:
; 初始化页目录
mov ax, SelectorFlatRW
mov es, ax
mov edi, PageDirBase1 ; 此段首地址为 PageDirBase1 ,PageDirBase1 equ 210000h ;
xor eax, eax
mov eax, PageTblBase1 | PG_P | PG_USU | PG_RWW
mov ecx, [PageTableNumber]
.1:
stosd
add eax, 4096 ; 为了简化, 所有页表在内存中是连续的.
loop .1
; 再初始化所有页表
mov eax, [PageTableNumber] ; 页表个数
mov ebx, 1024 ; 每个页表 1024 个 PTE
mul ebx
mov ecx, eax ; PTE个数 = 页表个数 * 1024
mov edi, PageTblBase1 ; 此段首地址为 PageTblBase1, PageTblBase1 equ 211000h
xor eax, eax
mov eax, PG_P | PG_USU | PG_RWW
.2:
stosd
add eax, 4096 ; 每一页指向 4K 的空间
loop .2
; 在此假设内存是大于 8M 的
mov eax, LinearAddrDemo ;mov eax,0x00401000,转化为2进制为:0000,0000,0100,0000,0001,0000,0000,0000
shr eax, 22 ;shr eax,0x16. eax变为0x00000001
mov ebx, 4096 ;mov ebx,0x00001000
mul ebx ;mul eax,ebx;eax变为0x00001000
mov ecx, eax ;ecx=0x00001000
mov eax, LinearAddrDemo ;eax=0x00401000,转化为2进制为:0000,0000,0100,0000,0001,0000,0000,0000
shr eax, 12 ;eax=0x00000401
and eax, 03FFh ; 1111111111b (10 bits) eax=0x00000001
mov ebx, 4 ;ebx=0x00000001
mul ebx ;eax=0x00000004
add eax, ecx ;eax=0x00001004
add eax, PageTblBase1 ;add eax,0x0021100,eax变为0x00212004
mov dword [es:eax], ProcBar | PG_P | PG_USU | PG_RWW ;es指向SelectorFlatRW的0x00212004,这句肯定把原来函数地址变了。
;相对于ox00211000页表首地址,多了1004h,0x00211000对应的是00000000h,
;多了1004就是401000h物理地址,对于这个地址赋值 ProcBar的首地址。见pmtest6.asm
mov eax, PageDirBase1
mov cr3, eax
jmp short .3
.3:
nop
ret
; ---------------------------------------------------------------------------
posted on 2011-05-09 11:10 wanghj_dz 阅读(1131) 评论(0) 编辑 收藏 举报