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  阅读(1120)  评论(0编辑  收藏  举报

导航