[050][x86汇编语言]16.1.1 简单分页模型: 计算从
2018-07-25 本文已影响13人
AkuRinbu
学习笔记
《x86汇编语言:从实模式到保护模式》
https://www.jianshu.com/p/d481cb547e9f
分页机制的引入背景
- 段不用的时候要被挪到磁盘,段要被用到的时候要被加载到内存;
- 引入分页机制是为了解决 空闲区域远远大于要加载的段 的浪费问题;
- 从80386处理器开始,引入分页机制,也就是说分页是由处理器固件而非操作系统实现的;
- 分页功能,就是用长度固定的页来代替长度不一的段;
物理地址
- 物理地址就是真实的内存地址;
单纯的分段模式
- 在单纯的分段模式下,线性地址就是物理地址;
从线性地址到页物理地址的映射
- 1、当程序加载时,操作系统会首先在虚拟内存中分配段;
- 2、然后,操作系统根据“ 段 需要分成多少页”,在物理内存中搜索空闲页;
- 3、当段比较大时,要按照页的尺寸分成好几个地址区段;
- 4、操作系统用每个区段的首地址,取高20位,乘以4,作为访问映射表的偏移量,用以确定表项;
- 5、操作系统将分配给该区段的页的物理地址写入该表项;
- 6、最后,操作系统把原本需要写入每个区段的程序数据,写到对应的物理页中;
计算物理内存地址
mov edx,[0x2002]
已知 段地址 0x0020 0000
指令中给出偏移量 0x2002
得到线性地址 0x00202002
0x00200000
+ 0x 2002
-------------
0x00202002
高20位 低12位
0x 00202 002
线性地址的高20位(0x 00202 )就是表格(映射表)索引,
将索引乘以4,得到0x00808,这就是映射表偏移量,
在映射表 +0x 00808 表项里面,存着 0x 0000 7000
0x 0000 7000 就是页的物理地址;
线性地址的低12位(0x 002)就是页内偏移量;
用页物理地址加上页内偏移量,就是最终的物理内存地址
0x 0000 7000 + 0x 002 = 0x 0000 7002
页的最小单元是 4KB
4 KB = 2^12 Byte
因此只需要 线性地址的低12位 作为 页内偏移量,
就足够寻址 完整的单个 4KB 的物理页。
物理内存不够分
- 每个任务都可以有
4GB
的虚拟内存空间; - 操作系统可以将暂时不用的页(指的是物理页里的那些数据)退避到磁盘,调入马上就要使用的页,通过这种手段来实现分页内存管理;
- 这就是为什么内存容量较小时,程序越来越慢,硬盘工作指示灯不停地闪烁的原因(频繁地在读写磁盘)。