页式存储
地址转换流程
逻辑地址----分段机制--->线性地址----分页机制--->物理地址
实现分段机制,可以提供保护,而实现分页机制,可以实现虚拟内存,使内存管理变得灵活。
页表
对于一个两级页表来说,页表分为页目录和页表
cr3:寄存器,指向页目录开头
PDE:页目录表的表项,指向某一个页表的开头
PTE:页表的表项,指向某一个物理页
在启动页表前需要将页表内容初始化。
分页机制是否生效取决于cro的最高位PG位,所以开启页表只需要将cr3指向页目录表,设置PG位=1.
启动页表
1. 初始化页表
在启动页表前需要将页表内容初始化。在页目录中填入页表的地址,页表中填入物理页的地址。在具体的初始化方法中,操作系统更具硬件内存的大小来设置页表的个数。
使用int 15h获取内存信息 地址范围描述符 1
2
3
4
5
6
7
8
9
10
11
12;需要设置的寄存器代表的意义
eax = 0xe820 ;工作号
ebx = 0x0 ;后续值
es:di ;指向地址范围描述符结构
ecx ;地址范围描述符的大小
edx = 0x534d4150 ;签名
;返回结果
CF ; 返回0代表没有错误
eax ; 0x534d4150
es:di ; 地址范围结构描述符,与输入相同
ecx ; 地址范围描述符的大小
ebx ; 下一个地址范围描述符需要的后续值
2.启动分页
分页机制是否生效取决于cro的最高位PG位,所以开启页表需要将cr3指向页目录表,设置PG位=1. 不同的程序可以通过不同的cr3来拥有不同的页表,相同的地址。
pte属性位
- 前20位:表示物理页的地址
- P位:表示页是否在内存中,1表示在内存中,0表示不在内存中,需要从硬盘中读取。
- R/W位:表示页是否可写,1表示可写,0表示只读
- U/S位:表示页是否用户态可访问,1表示用户态可访问,0表示只有内核态可访问
- A位:表示页是否被访问过,1表示被访问过,0表示没有被访问过
- D位:表示页是否被修改过,1表示被修改过,0表示没有被修改过
- G位:表示页是否被全局页表引用,1表示被全局页表引用,0表示没有被全局页表引用
- PAT位:表示页是否支持高速缓存,1表示支持,0表示不支持
- PS位:表示页是否是大页,1表示是大页,0表示不是大页
- NX位:表示页是否可执行,1表示不可执行,0表示可执行
页式存储
https://jfsas.github.io/2024/09/30/页式存储/