实现虚拟存储器需要三方面的硬件支持: 1、请求分页/段的页表或段表机制; 请求分页存储管理是建立在分页存储管埋的基础上,并结合虚拟存储系统原理实现的,是目前常用的一种实现虚拟存储器的方式 2、缺页/段中断机构; 作用就是就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。 3、地址变换机构。 当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址)寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。
虚拟地址转换为物理地址过程为:
虚拟地址的高位(VPN)和当前程序的ASID送给TLB,与TLB中的所有entry表项同时进行匹配,匹配过程中如果有如下都满足的TLB表项,从中读取PFN,V,D域
1.当前程序(进程)的ASID等于TLB表项中的ASID(EntryHi的Gbit置位的话,不比较ASID) 2.虚拟地址的bit63~62与TLB表项的R字段相同 3.虚拟地址的相应位域和TLB的VPN2相同,相应位域取决于PageMask寄存器设置的页表大小 注意最终转换是否成功取决于V,D域。如果V无效,该entry无效,产生TLB无效异常;如果D指示不可写,而有写操作会产生TLB修改异常。如果没有上述异常,即是TLB命中,命中entry的PFN和虚拟地址低位(1KBpage的话是低10bit,4KBpage的话低12bit)构成最终的物理地址。
32位X86,虚拟地址空间通过一个段表(段表不需要bit位索引)和2层页表进行转化,前10个bit位用于索引第一层页表,中间10个bit位用于索引第二层页表,后12位是页内的偏移。每个页表的元素占用4个字节,页大小是4KB,一个物理页可以容纳第1层级页表和第二层级页表,第二层页表的个数取决于所属段的长度(即第一层页表的元素的个数)。
64位X86,虚拟地址空间可以延伸到64位,为了简化地址转换,当前很多处理器只用了48位(前16位没有使用),能够满足256TB的内存空间使用,采用段表和4层页表进行转换(9个bit位+9个bit位+9个bit位+9个bit位 + 12个bit位,段表不需要bit位索引,前4个9bit位分别用于4层页表的索引,最后一个12bit用于页内偏移,总计48bit位),只有第一层页表是被填满的,其他三层页表只有对应虚拟空间地址被使用了才会被填充。为了优化,64位X86可以消除1个或者2个层级的页表。每个物理页的大小是4KB,第4层级的页表可以管理2MB,第3层级的页表可以管理1GB的数据,若操作系统分配了连续的2MB物理页,则可以省去第4层级的页表,让第三层的页表元素直接指向2MB的物理页,同样的,若操作系统分配了连续的1GB物理页,则可以省去第3、4层级的页表,让第2层级页表的元素直接指向1GB的物理页。这样做既可以节省页表存储的开销,还可以提高地址转换效率。