有一台可以生成16位地址的计算机,地址范围为64K,这些是虚拟地址。但是计算机的物理内存只有32KB。
分析:
16位地址,那么它的CPU的地址总线为2^16,寻址能力为2^16/1024=64K,所以其地址范围为0--64K,这是CPU一次能读的
最大地址数据,是虚拟地址,实际的物理内存只有32K。因此,虽然可以编写64KB的程序,但它们却不能被完全调入到内存中
运行。在磁盘上必须有一个可以大到64KB的程序核心映象的完整副本,以保证程序片段在需要的时候能被调入内存。
虚拟地址空间以页(page)为单位划分。在物理内存中对应的单位称为页帧(page frame)。页面和页帧的大小总是一样的,这里
是4KB,现在常用的系统页大小一般从512字节到64K(Nand Flash有的为512byte,有的为2K)。64K虚拟地址空间,有16个
页;32K的物理地址,有8个页帧。RAM和磁盘之间的转换总是以page为单位的。
程序访问地址0:
MOV REG,0
将虚拟地址0送到MMC。MMC看到虚拟地址落在页面0范围内(0-4095),根据映射,这一页面对应的是物理内存中的page
frame页帧2(8192-12287),因此MMU把地址变换为8192,并把地址8192送到总线上。内存对MMU的操作一无所知,它只看
到一个读或写地址8192的请求,执行它。MMU从而有效地把所有从0-4095的虚拟地址映射到了8192-12287的物理地址。
程序访问地址8192:
MOV REG,8192
实际上被映射到物理内存中的第6页帧(24576-28671),实际执行的是如下指令:
MOV REG,24576
程序访问地址20500:
MOV REG,20500
虚拟地址在20500距虚拟页面5(虚拟地址20480--24575)的起始地址20个字节,虚拟页面5映射到物理内存地址页帧3,所以映射
地址是12288+20=12308
MOV REG,12308
通过恰当的设置MMU,可以把16个虚拟页面映射到8个page frame中的任何一个。那么另外多出来的8个表示叉号的页并没有
被映射,在实际的硬件中,用一个Present/absent bit (在/不在)记录哪一个page在内存中实际存在。当程序试图使用未映射的
页面时,比如访问如下地址,会发生什么呢?
MOV REG,32780
虚拟页面8(从32768开始)的第12个字节所对应的物理地址是什么呢?MMU注意到这个页面没有被映射(图中显示为X),于
是CPU陷入到操作系统系统,这个陷阱称为页面失效(page fault)。操作系统找一个很少使用的页帧并把它的内容写到磁盘。随
后把需要访问的页面到到刚才回收的页帧中,修改映射,然后重新启动引起陷阱的指令。
下看看MMU的内部结构以便了解它是怎么工作的,以及为什么我们选用的页面大小都是2整数次幂。在下 图中可以看到一个虚