分页存储管理中逻辑地址到物理地址的转换过程解析
文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在十万人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍。首先要知道,物理地址=块号+页内地址
逻辑地址=页号+页内地址
所以物理地址和逻辑地址后面部分是相同的,即都为页内地址。
下面以一个例子说明如何由逻辑地址求物理地址
首先是分页存储
页号 物理块号
0 3
1 7
2 9
3 5
则逻辑地址0A5C(H)所对应的物理地址是什么?要求:写出主要计算过程。
用户编程空间共64个页面,2ˆ6=64 得知页号部分占6位,由“每页为1KB”,1K=2^10,可知内页地址占10位。
由“内存为16KB”,2^4=16得知块号占4位。
逻辑地址0A5C(H)所对应的二进制表示形式是:0000101001011100,后十位1001011100是页内地址,0 000010为为页号,页号化为十进制是2,在对照表中找到2对应的物理块号是9,9转换二进制是1 0 01,即可求出物理地址为10 011001011100,化成十六进制为265C;
即则逻辑地址0A5C(H)所对应的物理地址是265C;
(2)接下来介绍页表的硬件实现:
上一小节中写到页表是逻辑地址转化到物理地址的关键所在。那么页表如何存储?
每个操作系统都有自己的方法来保存页表。绝大多数都会为每个进程分配一个页表。现在由于页表都比较大,所以放在内存中(以往是放在一组专用寄存器里),其指针存在进程控制块(PCB)里,当进程被调度程序选中投入运行时,系统将其页表指针从进程控制块中取出并送入用户寄存器中。随后可以根据此首地址访问页表。
页表的存储方式是TBL(Translation look-aside buffer, 翻译后备缓冲器)+内存。TBL实际上是一组硬件缓冲所关联的快速内存。若没有TBL,操作系统需要两次内存访问来完成逻辑地址到物理地址的转换,访问页表算一次,在页表中查找算一次。TBL中存储页表中的一小部分条目,条目以键值对方式存储。
(3) 页表的数据结构
Hierarchical Paging(层次化分页),实际上就是将页号分为两部分,第一部分作为索引,第二部分作为页号的偏移,是为了解决页表越来越大的问题而提出的。
分页存储有内部碎片。
接下来是分段存储segmentation
为什么要引入分段存储呢,简单地说分页管理方式是从计算机的角度考虑设计的,以提高内存利用率,提高计算机的性能,且分页通过硬件机制实现,对用户完全透明;而分段管理方式的提出则是考虑了用户和程序员,以满足方便编程,信息保护和共享,动态增长以及动态链接等多方面的要求。
段式管理方式按照用户进程的自然段划分逻辑空间。例如,用户进程由主进程,两个子进程,栈和一段数据段构成,于是便可以把这个用户进程分为五段,每段从0开始编址,并分配一段连续的地址空间(段内要求连续,段间可以不连续)。
因此用户通过两个量来指定地址:段名称和偏移。段是编号的,通过段号而非段名称来引用。因此逻辑地址由有序对构成:
<segment-number,offset>(<段号s, 段内偏移d>)
段页式存储
页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序逻辑的结构并有利于段的共享,结合起来便形成了段页式存储管理。
在段页式系统中,作业的逻辑地址为三部分:段号,页号和页内偏移。
在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段表长TL。进行地址变换时,首先利用段号S,将它与段表长TL进行比较。若S<TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。右图示出了段页式系统中的地址变换机构。
在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。
显然,这使访问内存的次数增加了近两倍。为了提高执行速度,在地址变换机构中增设一个高速缓冲寄存器。每次访问它时,都须同时利用段号和页号去检索高速缓存,若找到匹配的表项,便可从中得到相应页的物理块号,用来与页内地址一起形成物理地址;若未找到匹配表项,则仍须再三次访问内存。
以上便是全部介绍,本文图片为网上下载非本人创作,如有侵权请马上与我联系。
加油吧,程序员!