汇编语言从实模式到保护模式

[062][x86汇编语言]第16章 源码分析 过程[alloc

2018-08-13  本文已影响23人  AkuRinbu

学习笔记

《x86汇编语言:从实模式到保护模式》
https://www.jianshu.com/p/d481cb547e9f

详细调用关系以及过程在整个内核程序中的作用

参见 https://www.jianshu.com/p/2dba8674e8fd

内核程序:过程[alloc_inst_a_page]

过程[alloc_inst_a_page]

代码流程

取自源码文件 c16_core.asm

alloc_inst_a_page:                          ;分配一个页,并安装在当前活动的
                                            ;层级分页结构中
                                            ;输入:EBX=页的线性地址
         push eax
         push ebx
         push esi
         push ds
         
         mov eax,mem_0_4_gb_seg_sel
         mov ds,eax
         
         ;检查该线性地址所对应的页表是否存在
         mov esi,ebx
         and esi,0xffc00000
         shr esi,20                         ;得到页目录索引,并乘以4 
         or esi,0xfffff000                  ;页目录自身的线性地址+表内偏移 
                                            ;ESI = 页目录表表项的线性地址

         test dword [esi],0x00000001        ;P位是否为“1”。检查该线性地址是 
         jnz .b1                            ;否已经有对应的页表
          
         ;创建该线性地址所对应的页表 
         call allocate_a_4k_page            ;分配一个页做为页表 
         or eax,0x00000007
         mov [esi],eax                      ;在页目录中登记该页表
          
  .b1:
         ;开始访问该线性地址所对应的页表 
         mov esi,ebx
         shr esi,10
         and esi,0x003ff000                 ;或者0xfffff000,因高10位是零 
         or esi,0xffc00000                  ;得到该页表的线性地址
                                            ;ESI=页表的线性地址
         
         ;得到该线性地址在页表内的对应条目(页表项) 
         and ebx,0x003ff000
         shr ebx,10                         ;相当于右移12位,再乘以4
         or esi,ebx                         ;页表项的线性地址 
                                            ;ESI=页表表项的线性地址
         call allocate_a_4k_page            ;分配一个页,这才是要安装的页
         or eax,0x00000007
         mov [esi],eax 
          
         pop ds
         pop esi
         pop ebx
         pop eax
         
         retf  

注意:下列图解中可能的存在一个容易混淆的部分

页目录表物理地址 + 高10位x4 = 页目录表项的线性地址
页表物理地址 + 中10位x4 = 页表表项的线性地址
物理页物理地址 + 低12位 = 真正的物理地址

一、检查该线性地址所对应的页表是否存在

         mov esi,ebx
         and esi,0xffc00000
         shr esi,20                         ;得到页目录索引,并乘以4 
         or esi,0xfffff000                  ;页目录自身的线性地址+表内偏移 

         test dword [esi],0x00000001        ;P位是否为“1”。检查该线性地址是 
         jnz .b1                            ;否已经有对应的页表
1、传入的参数 EBX=页的线性地址,有何独特之处?
2、图解假设传入参数为 EBX =0x11122000 进行移位操作
寄存器ESI各比特值的变化.png

参见 https://www.jianshu.com/p/d6b534560669

高10位 要乘以4 作为页目录表偏移量
低12位 直接作为 页的偏移量

原来的高10位变成了 现在的低12位
页目录表 不仅做页目录表 还做页表 现在更要作为 页

现在的低12位 与 现在的页 正好结合
3、从页目录表表项中取出页表的物理地址,查看对应的页表是否已经存在
 test dword [esi],0x00000001
 jnz .b1  

二、为页表申请一个物理页

 ;创建该线性地址所对应的页表 
         call allocate_a_4k_page            ;分配一个页做为页表 
         or eax,0x00000007
         mov [esi],eax                      ;在页目录中登记该页表

参见 https://www.jianshu.com/p/49cbaccd38c5

三、计算要访问的页表的线性地址

  .b1:
         ;开始访问该线性地址所对应的页表 
         mov esi,ebx
         shr esi,10
         and esi,0x003ff000                 ;或者0xfffff000,因高10位是零 
         or esi,0xffc00000                  ;得到该页表的线性地址
图解假设传入参数为 EBX =0x11122000 进行移位操作 计算要访问的页表的线性地址

参见 https://www.jianshu.com/p/d6b534560669

四、访问页表表项

 ;得到该线性地址在页表内的对应条目(页表项) 
         and ebx,0x003ff000
         shr ebx,10                         ;相当于右移12位,再乘以4
         or esi,ebx                         ;页表项的线性地址 
         call allocate_a_4k_page            ;分配一个页,这才是要安装的页
         or eax,0x00000007
         mov [esi],eax 
计算 要访问的 页表表项的线性地址
上一篇 下一篇

猜你喜欢

热点阅读