[050][x86汇编语言]16.1.1 简单分页模型: 计算从线性地址到页物理地址的映射

学习笔记

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

分页机制的引入背景

  • 段不用的时候要被挪到磁盘,段要被用到的时候要被加载到内存;
  • 引入分页机制是为了解决 空闲区域远远大于要加载的段 的浪费问题;
  • 80386处理器开始,引入分页机制,也就是说分页是由处理器固件而非操作系统实现的;
  • 分页功能,就是用长度固定的页来代替长度不一的段

物理地址

  • 物理地址就是真实的内存地址;

单纯的分段模式

  • 在单纯的分段模式下,线性地址就是物理地址

从线性地址到页物理地址的映射

  • 1、当程序加载时,操作系统会首先在虚拟内存中分配
  • 2、然后,操作系统根据“ 段 需要分成多少页”,在物理内存中搜索空闲页
  • 3、当比较大时,要按照页的尺寸分成好几个地址区段
  • 4、操作系统用每个区段的首地址,取高20位,乘以4,作为访问映射表的偏移量,用以确定表项;
  • 5、操作系统将分配给该区段的页的物理地址写入该表项;
  • 6、最后,操作系统把原本需要写入每个区段的程序数据,写到对应的物理页中;

计算物理内存地址

《x86汇编语言:从实模式到保护模式》 P.304 图16-4 从线性地址到页物理地址的映射.PNG
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的虚拟内存空间;
  • 操作系统可以将暂时不用的页(指的是物理页里的那些数据)退避到磁盘,调入马上就要使用的页,通过这种手段来实现分页内存管理
  • 这就是为什么内存容量较小时,程序越来越慢,硬盘工作指示灯不停地闪烁的原因(频繁地在读写磁盘)。

你可能感兴趣的:([050][x86汇编语言]16.1.1 简单分页模型: 计算从线性地址到页物理地址的映射)