1. 分段,分页机制
不分页: 线性地址 == 物理地址
分页: 线性地址 != 物理地址
线性地址空间也就是所有可能线性地址的范围.
操作系统会在启动的时候测量到实际的内存有多少, 什么范围. 如果支持分页,
线性地址是多少无所谓, 只要最后映射到的物理地址在16M范围内就可以
--------
虚拟地址是操作系统提供的一种地址描述,处理器本身并无虚拟地址的提法
而线性地址是处理器具有的一种地址描述
二者不可混淆
在处理器这级,各种地址的关系如下,
段寄存器:偏移 组成逻辑地址
段寄存器指向的描述符的段基址+偏移地址=线性地址
如果不分页,线性地址=物理地址
如果分页,线性地址通过分页机制转换为物理地址
操作系统提出的虚拟地址概念是对处理器内存寻址的扩展,
虚拟存储由内存和外存组成,外存是除内存外的其他物理存储,比如磁盘等
比如把一块数据装入到一块虚拟存储
这块虚拟存储由一段线性地址描述,
其中一部分数据装入物理内存,对应的线性地址设置为存在标志
不能放入内存的部分就被操作系统放在外存上,对应的线性地址设置为不存在标志
当处理器访问这块线性地址时,
如果访问到了存在标志的线性地址,就可以直接读取(暂不考虑是否分页转化物理地址)
如果访问到了不存在标志的线性地址,处理器将发出(页或段)不存在异常,这个异常通常被操作系统hook,这样执行流程将来到系统异常处理例程,操作系统把外存中的数据装入内存,
并把对应线性地址里的不存在标志置为存在,然后返回到发生异常处重新执行
http://blog.csdn.net/yunsongice/category/646543.aspx?PageNumber=2
2. 分段机制
虚拟地址(逻辑地址)->线性地址转换
涉及段描述符表, 段选择符,段描述符
段选择符:
段选择符与描述符表:
段描述符:
3. 分页机制
为什么采用二级分页?(以一页4K来看,可以有2^20页)
理论上讲不会节省空间,因为一级情况下,占用: 2^20 *4 = 4M. 二级情况下,占用2^10*4 + 2^20*4
但实际中,如果页表只有一级,那么2^20个页表要线性排列,即在连续的空间上排列,即使某项为空也要留下页表项的位置。
如果有两级页表,那么第一级的空间仍然要分配,但第二级的页表可以以1024(4K/4)项为单位不连续分布,这样的话如果页表使用的空间基本与进程使用的空间呈线性,如果进程使用的内存空间小,就可以大大减少页表所占空间。
最后,如果进程使用所有的线性地址空间,用二级页表的空间比用一级页表的空间大0.1%左右。
也就是说,(1). 进程有自己独立的页表项 (2). 页表目录是必需的 (3). 如果是一级的话,就必需有4M空间 (4) 一般进程不会用到那么大内存空间。所以如果以8M来说,就只需要4K+ 2* 4k = 12k大小(页表是按需分配的)