页 页表 页表项
来源:互联网 发布:哪下载软件安全 编辑:程序博客网 时间:2024/05/16 11:50
//
//操作系统和计算机组成原理里都讲到内存管理的页式管理,但是本人以及很多初次学习分页的时候,都会迷茫页表大小和页表项大小之间的关系,本人仔细分析了后写了这篇blog,仅当学习交流,个人理解之用,如果有错或者分析不够严谨,欢迎指正。
//按字、图结合起来分析,相信还是比较容易看懂。
//一、首先明确几个概念
逻辑地址:是程序编译后,生成的目标模块进行编址时都是从0号单元开始编址,称之为目标模块的相对地址,即为逻辑地址。
页:将进程划分的块,对应的大小就叫页面大小。
页框:将内存划分的块。
页和页框二者一一对应,一个页放入一个页框,(理论上)页的大小和页框的大小相等。
页表:就是一个页和页框一一对应的关系表。【存放在内存中】 关系表只是起到一个索引的作用,说白了就是能根据关系表能查到某一个页面和哪一个页框所对应。
//
//
//二、用例子说话【例子出现在:《王道考研操作系统》的内存管理部分】
已知条件:逻辑地址32位、页面大小4KB、页表项大小4B,按字节编址。
分析:
1.
首先32位的虚拟地址可表示的进程大小应该是2^32B = 4GB(暂时别去想页号P占多少位,W占多少位)
2.(根据页的定义和页面大小的定义)将进程进行分页:
3.我们已经知道了页面的数目为:2^20页。现在的迷茫点就在于页表项的问题上。
上图在页表上已经给出了几个数据:20位,12位,32位,2^20项。一一解释如下【请结合上图一个一个数据分析】:
2^20项:因为页表的作用是要将页面的页框一一对应起来,所以,每一个页面在页表中都应该有一个页表项:用来表示一个页号对应一页页框号(内存中的块号),故应
该有2^20项。【不应该有问题吧,就好像一个班有50个同学,每个人都应该有一个地址一样】
20位:已经很显然了,需要表示出2^20个页表项,就至少需要20位的地址。为什么只取20位而不是21位,22位呢,本人现在还没想这个问题,就暂时定为恰好取20位即可。
32位:已知条件里告诉了页表项大小为4B,那么自然就应该是32位了。
12位:32位-20位 = 12位。为什么页框号地址为12位,只能表示2^12个页框,要小于2^20个页面呢,因为并不是进程的每一个页面都要调入内存。其实32位、12位、20位这三个数据还是有一定依据的,在二级分页的时候就会发现“哦,原来刚刚好”。此处暂不讨论二级分页。
4.通过上面的分析我们得出了哪些数据:
逻辑地址32位,进程大小:4GB。
页面:大小4KB,数量:2^20页。
页表项:4B,数量:2^20项。所以页表就需要4B*2^20 = 4MB的空间存储(这就是书中说:页表项大小为4MB的由来)进一步,主存的页框大小和页面大小是相等的,也为4KB,所以将页表存在主存就需要占用4MB/4KB = 1024页(因为页表也是存在主存中的,而主存也是按页框划分的。这的确是一种资源浪费,所以就需要建立二级页面,将其大小控制在1页之内,将二级页面存入主存即可)
- 页 页表 页表项
- 页 页表 页表项
- 【操作系统】页式储存方式,页,页表,页表项
- 页表
- 页表
- 内存管理图解---------页目录表 页表
- x86中的页表结构和页表项格式
- x86中的页表结构和页表项格式
- x86中的页表结构和页表项格式
- X86中的页表结构和页表项格式
- 页表项(页描述子)中各个位的作用
- linux-0.11调试教程,task2参数所在内存页的页目录项和页表项
- 获取页表项和页目录项VA的汇编代码的解析(整理)
- 页目录项和页表项——《x86汇编语言:从实模式到保护模式》读书笔记43
- linux 页表
- 页表项格式
- base-kernel-页表
- [转载]页面、页表
- java---转换流1(InputStreamReader和OutputStreamWriter)
- 欢迎使用CSDN-markdown编辑器
- hdoj 5672 String (尺取法)
- Android 自定义字母搜索表
- 进制转换(随意转)
- 页 页表 页表项
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
- c#之插入排序的实现
- github上的webrtc
- 编译原理----基础概念
- 初识Leap motion
- 基于QT和opencv的瞳孔定位及跟踪程序
- hibernate 注解说明
- session详解