1.思想
- 把进程分页,各个页面可离散地放到各个内存块中
- 操作系统以页框为单位为各个进程分配内存空间
- 进程的页面与内存的页框有一一对应的关系
- 各页面不必连续存放,可以放到不相邻的各个页框中
- 虽然进程的各个页面是离散存放的,但是页面内部是连续存放的
2.易混概念
2.1内存块
- 别称:页框、页帧、物理块、物理页
- 将内存空间分为一个个大小相等的分区,每个分区就是一个页框
2.2页面
- 别称:页
- 将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页”
2.3内存块号
- 别称:页框号、页帧号、物理块号、物理页号
- 每个页框有一个编号,即“页框号”,页框号从0开始
2.4页号
- 别称:页面号
- 每个页面也有一个编号,即“页号”,页号从0开始
3.页表
- 页表记录了页面和实际存放的内存块之间的映射关系
- 一个进程对应一张页表,进程的每个页面对应一个页表项,每个页表项由“页号”和“块号”组成
- 每个页表项的大小是相同的,页号是“隐含”的,即页号不占用内存空间
- i号页表项存放地址 = 页表始值 + i * 页表项大小
4.逻辑地址结构
可拆分为 【页号,页内偏移量W】
- 页号 = 逻辑地址 / 页面大小
- 页内偏移量 = 逻辑地址 % 页面大小
- 逻辑地址结构包含两个部分:前K位页号,后M位页内偏移量
- 如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是2^K个内存单元
- 如果有M位表示“页号”,则说明在该系统中,一个进程最多允许有2^M个页面
页表项与逻辑地址结构区分
- 页表项与地址都有两部分组成,而且第一部分都是页号;
- 但页表项的第二部分是物理内存中的块号;
- 而逻辑地址结构的第二部分是页内偏移量;
- 页表项的第二部分和逻辑地址的第二部分共同组成物理地址。
5.如何实现地址转换
- 计算出逻辑地址对应的【页号,页内偏移量】
- 找到对应页面在内存中的存放位置(查页表)
- 物理地址 = 页面始址 + 页内偏移量
6.Sample
6.1每个页表项占多少字节
假设某系统物理内存大小为4GB,页面大小为4KB,则每个页表项至少应该为多少字节?
- 内存块大小 = 页面大小 = 4KB = 2^12B
- 4GB的内存总共会被分为
2^32 / 2^12 = 2^20
个内存块 - 内存块号的范围应该是
0 ~ 2^20-1
- 内存块号至少要用20bit来表示
- 至少要用3B来表示块号(3*8=24bit)
- 由于页号是隐含的,每个页表项占3B,存储整个页表至少需要
3*(n+1)B
,其中,n为页号数量
注意:页表记录的只是内存块号,而不是内存块的起始地址。J号内存块的起始地址 = J * 内存块大小
6.2地址转换
如果要访问逻辑地址A,则
- 确定逻辑地址A对应的“页号”P
- 找到P号页面在内存中的起始地址(需要查页表)
- 确定逻辑地址A的“页内偏移量”W
- 则,逻辑地址A对应的物理地址 = P号页面在内存中的起始地址 + 页内偏移量W
如,假设某计算机系统,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址110对应的页号、页内偏移量是多少?
- 页号 = 110 / 50 = 2
- 页内偏移量 = 110 % 50 = 10
如果每个页面大小为
2^k
B,用二进制数表示逻辑地址,则末尾k位即为页内偏移量,其余部分为页号。如,某计算机用32个二进制为表示逻辑地址,页面大小为4KB=2^12B=4096,逻辑地址为4098的页号和页内偏移量
- 4097用二进制表示
0000 0000 0000 0000 0001 0000 0000 0010
- 页号 = 4098 / 4096 = 1 =
0000 0000 0000 0000 0001
- 页内偏移量 = 4098 % 4096 = 2 =
0000 0000 0010
假设物理地址也用32位二进制表示,则由于内存块大小 = 页面大小,因此:
- 0号内存块的起始物理地址是
0000 0000 0000 0000 0000 0000 0000 0000
- 1号内存块的起始物理地址是
0000 0000 0000 0000 0001 0000 0000 0000
- 2号内存块的起始物理地址是
0000 0000 0000 0000 0010 0000 0000 0000
- 3号内存块的起始物理地址是
0000 0000 0000 0000 0011 0000 0000 0000
假设通过查页表得知1号页面存放的内存块是9(1001),则
- 9号内存块的起始地址 = 9*4096 =
0000 0000 0000 0000 1001 0000 0000 0000
- 逻辑地址4098对应的物理地址 = 页面在内存中的起始地址 + 页内偏移量 =
0000 0000 0000 0000 1001 0000 0000 0010