Linux操作系统:分页管理技术

分页的基本概念

(1)逻辑空间分页

将一个进程的逻辑地址空间划分成若干大小相等的部分,每个部分称作页面或页。每页都有一个编号,叫做页号,页号从0开始依次编排,如0,1,2……。

(2)内存空间分块

把内存划分成与页面相同大小的若干存储块,称作内存块。块号从0开始依次顺序排列:0#块,1#块,2#块,……。页面(或块)的大小是由硬件确定的,它一般选择为2的若干次幂。不同机器中页面大小是有区别的,例如,IBM AS/400规定的页面大小为512 B,即,29,而Intel 80386的页面大小为4 KB(即212,4096 B)。

(3)逻辑地址表示

在分页存储管理方式中,表示地址的结构如下图所示。


Linux操作系统:分页管理技术

它由两部分组成:前一部分表示该地址所在页面的页号p;后一部分表示页内位移d,即页内地址。本图中所示的两部分构成的地址长度为32位。其中0~11位为页内地址,即每页的大小为4 KB,212;12~31位为页号,表示地址空间中最多可容纳220个页面。

计算:根据逻辑地址计算页号和页内地址?

对于某台具体机器来说,其地址结构是一定的。如果给定的逻辑地址是A,页面的大小为L,则页号p和页内地址d可按下式求得:

p = INT[A/L] , d = [A] MOD L

其中,INT是向下整除的函数,MOD是取余函数。

举例:设某系统的页面大小为1 KB, 逻辑地址A为3456,则页号p=INT (3 456/1 024) =3,页内地址d= 3 456 MOD 1 024 = 384。用一个数对(p, d)来表示就是(3,384)。

(4)内存分配原则

在分页情况下,系统以块为单位把内存分给各个进程,进程的每个页面对应一个内存块,并且一个进程的若干页可以分别装入物理上不连续的内存块中。

(5)设立页表

在分页系统中,允许将进程的各页面离散地装入内存的任何空闲块中,这样就出现进程的页号连续、而块号不连续的情况。怎样找到每个页面在内存中对应的物理块呢?为此,系统为每个进程设立一张页面映像表,简称页表。页表的作用是实现从页号到物理块号的地址映射。

如下图所示,在进程地址空间内的所有页(0~n-1)依次在页表中有一个页表项,其中记载了相应页面在内存中对应的物理块号。进程执行时,按照逻辑地址中的页号查找页表中的对应项,找到该页在内存中的物理块号。

Linux操作系统:分页管理技术

(6)建立内存块表

操作系统管理整个内存,它必须知道哪些块已经分出去了,哪些块还是空闲的,总共有多少块等物理存储的情况。这些信息保存在称作内存块表的数据结构中,整个系统有一个内存块表。每个内存块在内存块表中占一项,表明该块当前空闲还是已分出去了;如果已分出去,是分给哪个进程的哪个页面了。

地址映射

计算:根据逻辑地址和页表计算物理地址

通常,页表都放在内存中。当进程需要访问某个逻辑地址中的数据时,分页地址映像硬件自动按页面大小将CPU得到的相对地址分成两部分:页号和页内地址(p, d),具体步骤如下:

① 用页号p为索引去检索页表从页表中得到该页的物理块号f,把它装入物理地址寄存器中。

② 将页内地址d直接送入物理地址寄存器的块内地址字段d中。

③物理地址寄存器中的内容就是由二者拼接成的实际访问内存的地址,从而完成从逻辑地址到物理地址的转换。

Linux操作系统:分页管理技术

页的共享和保护

(1)页面共享

在多道程序系统中,数据共享很重要。尤其在一个大型分时系统中,往往有若干用户同时运行相同的程序(如编辑程序、编译程序)。很显然,更有效的办法是共享页面,避免同时在内存中有同一页面的两个副本。

页面共享的方法是使这些相关进程的逻辑空间中的页指向相同的内存块(该块中放有共享程序或数据)。应当指出,在分页系统中实现页面共享是比较困难的,并非所有页面都可共享。实际上,那些只读的页面(如程序文件)可以被共享,而数据页面往往并不能共享。

下图示出了三个进程共享5#内存块中文本数据的情况。

Linux操作系统:分页管理技术

(2)页面保护

页面保护是分页系统中的另一个必须小心处理的问题。即使在单纯分页系统(没有采用虚拟存储技术的分页系统)中,也常在页表的表项中设置存取控制字段,用于指明对应内存块中的内容允许执行何种操作,从而禁止非法访问。一般设定为只读(R)、读写(RW)、读和执行(RX)等权限。如果一个进程试图去写一个只允许读的内存块时,则会引起操作系统的一次中断——非法访问性中断,操作系统会拒绝该进程的这种尝试,从而保护该块的内容不被破坏。

(3)分页技术的总结

分页技术可以用36个字来总结:

逻辑空间分页 物理空间分块

页与块一样大 页连续块离散

用页号查页表 由硬件做转换


分享到:


相關文章: