27 - x86系统上的内存分页

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

1. x86系列处理器上的页式内存管理

  • 硬件层面 直接支持内存分页机制
  • 默认情况下不使用分页机制(段式内存管理)
  • 分页机制 启动后,使用 二级页表 对内存进行管理

1.1 x86系列处理器的分页方式(32位)

在这里插入图片描述

  • x86分页机制示意图

在这里插入图片描述

  • 一些小结论(对应上图中的10、10、12):
    • 页目录大小
      2 ^ 10 = 1024 项(也即多少个页表),每项4字节,共计 2^10 * 4 = 2^12 = 4KB
    • 子页表大小
      2 ^ 10 = 1024 项(也即多少个页面),每项4字节,共计2^10 * 4 = 2^12 = 4KB
    • 页大小
      2 ^ 12 = 4KB
  • 一些重要结论(针对32位 x86 处理器)
    • 页目录占用1内存页(可访问1024个子页表)
    • 单个子页表占用1内存页(可访问1024个页面)
    • 页面起始地址按4K字节对齐(总是4096整数倍)
    • 分页后可访问的虚拟内存空间为:
      ( 1024 * 1024 ) * 4KB = 4GB

1.2 最简单的分页构建方式

在这里插入图片描述

1.3 x86系列处理器上的页属性

  • 由于物理页面的地址必须按照4K字节对齐
  • 因此,页目录(页表)可使用地址的低12位进行属性描述

在这里插入图片描述

在这里插入图片描述

1.4 x86对分页的硬件支持

  • 将 cr3 指向页目录地址(可切换不同的页目录)
  • 将 cr0 最高位设置为1(硬件级开启分页机制)

在这里插入图片描述

1.5 汇编小贴士

  • loop
    • 循环指令,将 cx 减 1,若 cx 不为 0,则执行标签处代码
mov ax, 0
mov cx, 10

label:
	add ax, cx
	loop label
  • stosb、stosw、stosd
    • 把 al、ax、eax 中的值存储到 edi 指向的内存单元中
    • 同时 edi 的值根据方向标志增加或者减少(cld增加、std减少)
mov es, ax
mov edi, 0
mov eax, 0xFF
cld
stosd
; [es:0] --> 0xFF
; edi --> 4

2. 编程实验:x86处理器上的分页实现

2.1 stosd

【参看链接】:27 - x86系统上的内存分页 / 27 / 00

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2 分页实现

【参看链接】:27 - x86系统上的内存分页 / 27 / 01

  • 设置页目录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 设置子页表

在这里插入图片描述

3. 小结

  • x86处理器直接支持内存分页机制(默认关闭)
  • 分页机制启动后 ,使用二级页表对内存进行管理
  • 页目录和单个子页表占用1内存页(4K内存)
  • 页面起始地址按4K字节对齐
  • 分页后可访问的虚拟内存空间为4G
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值