关于分页管理

来源:互联网 发布:淘宝上怎么注册开店 编辑:程序博客网 时间:2024/05/17 23:42
在普通的单片机中,我们的内存管理都比较简单,顶多就是使用malloc函数分配一段内存;整个内存空间基本上是成线性分布的,一边是栈的生长方向,一边是堆的整体空间(当然,这个取决于编译器是怎样优化的,但是一般来说是这样)。但是,在操作系统中,内存又是怎样进行管理的呢?和嵌入式一样吗?这就是今天我们要讨论的问题。
一、分页存储管理
1.基本思想
用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
这个方法也是实现虚拟内存的基础,同时,在很多嵌入式的内存空间(比如飞思卡尔S12单片机系列)中,也采用了这种类似的思想。
2. 分页存储管理的地址结构
对于我们一般的程序,都有一个IP指针指向下一条要执行的指令,或者某一指针指向要取的数据。。如果以16位地址线为例,那么不采用分页存储管理的话,0-16位都表示“纯”地址;如果采用分页管理,则地址如下:
15--------------12         11--------------------------0
     页号P                 页内位移量W
页号4位,表示每个作业最多2的4次方=16页,页号从0000~1111。页内位移量的位数表示页的大小,若页内位移量12位,表示页的大小为则2的12次方=4k,也即页内偏移量从000000000000~111111111111
那么,实际上我们是对16位的指针做了一个硬性的划分,将其高四位作为页号,低位作为页内的偏移量。如果单纯这样做是没有任何意义的。但是分页管理更厉害的地方在于,采用了分页管理的方式,可以将连续的逻辑页放在不连续的物理页中。但是,这时需要一个名为“页表”的东西。
3. 硬件机制——页表及相应的寄存器
分页系统中,允许将进程的每一页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面对应的物理块,系统为每个进程建立一张页面映射表,简称页表。页表的作用是实现从页号到物理块号的地址映射。
页表:
页号 物理块号 存取控制    
  0        2    
  1       15
  2       14
  3       1  
两个寄存器:
页表始址寄存器(用于保存正在运行进程的页表的始址)
页表长度寄存器(用于保存正在运行进程的页表的长度)
4. 地址变换——如何使用?


(1) 程序执行时,从PCB(Page Control Block)中取出页表始址和页表长度,装入页表寄存器。
(2) 由分页地址变换机构将逻辑地址自动分成页号和页内地址。
例:0010|110010001110B=2C8EH
      页号为2,位移量为C8EH=3214D
(3) 将页号与页表长度进行比较(2<4),若页号大于或等于页表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。
(4) 将页表始址与页号和页表项长度的乘积相加,便得到该页表项在页表中的位置。
(5) 取出页描述子得到该页的物理块号。
(6) 对该页的存取控制进行检查。
(7) 将物理块号送入物理地址寄存器中,再将有效地址寄存器中的页内地址直接送入物理地址寄存器的块内地址字段中,拼接得到实际的物理地址。
例:0010|110010001101B
1110|110010001101B=EC8EH=60558D
或 14*4096+3214=60558D
原创粉丝点击