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
; ---------------------------------------------------------------------------

转载于:https://www.cnblogs.com/wanghj-dz/archive/2011/05/09/2040952.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值