学习笔记
《x86汇编语言:从实模式到保护模式》
https://www.jianshu.com/p/d481cb547e9f
创建内核的页目录和页表
- 一、填写页目录表
- 二、填写页表
一、填写页目录表
步骤
- 1、在最后一个表项,填入页目录表自己的物理地址;
- 2、在第一个表项,填入指向的第一个页表的物理地址;
实现
- 配书代码包,源码文件:
c16_core.asm
,Line : 935~939
;在页目录内创建指向页目录自己的目录项
mov dword [es:ebx+4092],0x00020003
;在页目录内创建与线性地址0x00000000对应的目录项
mov dword [es:ebx+0],0x00021003 ;写入目录项(页表的物理地址和属性)
说明
页目录表以及页表的格式

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

- 页目录表自己的物理地址 以及 指向的第一个页表的物理地址
可以参见开启页功能后的内存示意图
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
以此类推
开启分页机制

mov eax,cr0
or eax,0x80000000
mov cr0,eax ;开启分页机制
网友评论