[054][x86汇编语言]16.3.1 创建内核的页目录和页表

学习笔记

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

创建内核的页目录和页表

  • 一、填写页目录表
  • 二、填写页表

一、填写页目录表

步骤

  • 1、在最后一个表项,填入页目录表自己的物理地址
  • 2、在第一个表项,填入指向的第一个页表的物理地址;

实现

  • 配书代码包,源码文件:c16_core.asmLine : 935~939
;在页目录内创建指向页目录自己的目录项
mov dword [es:ebx+4092],0x00020003 

;在页目录内创建与线性地址0x00000000对应的目录项
mov dword [es:ebx+0],0x00021003    ;写入目录项(页表的物理地址和属性)      

说明

页目录表以及页表的格式

[054][x86汇编语言]16.3.1 创建内核的页目录和页表_第1张图片
页目录表表项 与 页表表项 的格式.png

0x00021003 代表什么?

  • 该数值前20位是物理地址的高20位
  • P=1,说明指向的页位于内存中;
  • RW=1,说明该目录项指向的页可读可写
  • US=0,说明指向的页不允许特权级为3的程序和任务访问,需要特权级为0、1、2的程序或任务访问;US=1,表示允许所有特权级别的程序访问;

0x0002 0003 填到哪里?

[054][x86汇编语言]16.3.1 创建内核的页目录和页表_第2张图片
填写页目录
  • 页目录表自己的物理地址 以及 指向的第一个页表的物理地址

可以参见开启页功能后的内存示意图
https://www.jianshu.com/p/4a420617c5db

二、填写页表:将页的物理地址填入页表

  • 配书代码包,源码文件:c16_core.asm,Line : 942~952
此时,ES指向0~4GB的内存空间

 ;创建与上面那个目录项相对应的页表,初始化页表项 
         mov ebx,0x00021000                 ;页表的物理地址
         xor eax,eax                        ;起始页的物理地址 
         xor esi,esi
  .b2:       
         mov edx,eax
         or edx,0x00000003                                                      
         mov [es:ebx+esi*4],edx             ;登记页的物理地址
         add eax,0x1000                     ;下一个相邻页的物理地址 
         inc esi
         cmp esi,256                        ;仅低端1MB内存对应的页才是有效的 
         jl .b2
  • 代码运行后的效果
页表
第1个表项 填入
页的物理地址 0x0000 0000 
对应 线性地址0x0000 0000~0x0000 0FFF
因为1个页是4KB =0x1000 Byte

第2个表项 填入
页的物理地址 0x0000 1000
对应 线性地址 0x0000 1000~0x0000 1FFF

以此类推

开启分页机制

[054][x86汇编语言]16.3.1 创建内核的页目录和页表_第3张图片
控制寄存器CR0.png
mov eax,cr0
or eax,0x80000000
mov cr0,eax ;开启分页机制

你可能感兴趣的:([054][x86汇编语言]16.3.1 创建内核的页目录和页表)