基本分页存储的基本概念
连续分配:为用户进程分配的必须是一个连续的内存空间
非连续分配:为用户进程分配的可以是一些分散的内存空间
将内存空间分为一个个大小相等的分区,每一个分区就是一个“页框”, 或“页帧”、“内存块”、“物理块”
将用户进程的地址空间也分为与页框大小相等的一个个区域,称之为“页”或“页面”。
进程的最后一个页面一般是没有一个页框那么大的,因此页框不能太大,否则可能产生过大的内部碎片
以上将进程空间以及内存空间拆分成一个个页框、页,目的是为了将一个个进程能分散的存放到内存中,那么进程地址空间分页之后,操作系统该如何实现逻辑地址到物理地址的转换?
用动态装入的思想,算一个逻辑地址对应的物理地址,只需要知道寄存器中的起始地址 + 逻辑地址(偏移量) 就是物理地址
同理,虽然将进程空间拆分成了一个个大小一样的区域,并且分散放在内存中,但是其一个个区域还是连续的,因此想要算出该逻辑地址,只需要完成以下4步:
1.通过逻辑地址算出,这个逻辑地址在的页的页号是多少(逻辑地址/页的大小 取整部分就是页号)
2.得出逻辑地址对应的页号,查询得到该页号的起始地址
3.算出这个逻辑地址相对这个页的偏移量(逻辑地址/页的大小 取余的数就是偏移量)
4. 物理地址 = 页面起始地址 + 页内偏移量
计算机的另一种计算方式
问题:那么如何知道页号对应的起始地址呢?
为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。
页表由 页号和块号 组成
1.一个进程对应一张页表
2.进程的每一页对应一个页表项
3.每个页表项由“页号”和“块号“组成
4.页表记录进程页面和实际存放的内存块之间的对应关系
每个页表项的长度是相同的,页号是”隐含“的
每个页表项里面只会放对应的块号,为什么不放块号的地址呢,因为只需要知道块号,就可以通过 块地址 = 块号 * 内存块大小(内存块大小可以通过上述图片中的方法计算得到)
基本变换机构
基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。
进程未执行时,页表的起始 和 页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
cpu要执行下一条指令,知道该指令的逻辑地址,按什么步骤找到物理地址的
对页表项大小的进一步探究
理论上,页表项长度位3B即可表示内存块号的范围,但是,为了方便页表的查询,常常会让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项