虚拟地址是有链接器产生的,链接器的主要工作是把多个代码模块组装在一起,并解决模块之间的引用,即处理程序代码件的地址引用,形成程序运行的静态内存空间视图。
MMU可以接受软件给出的地址对应关系数据,进行地址转换,地址关系转换表本身则是放物理内存中。
将虚拟地址空间和物理地址空间都分成同等大小的块,也成为页,按照虚拟页和物理页进行转换。
x86 CPU要想开启MMU,就必须先开启保护模式或者长模式,实模式下是不能开启MMU的。
页表并不存放虚拟地址和物理地址的对应关系,只存放物理页面的地址。
保护模式下的分页大小通常有两种:4KB大小:4MB大小。分页大小的不同,会导致虚拟地址位段的分离和页目录的等级不同,但虚拟页和物理页的大小始终是等同的。
保护模式下的分页
4KB页
该分页方式下,32位虚拟地址被分为3个位段:页目录索引、页表索引、业内偏移,只有一个页目录,其中包含1024个条目,每个条目指向一个页表,每个页表中有1024个条目。其中一个条目指向一个物理也,每个物理页4KB,4KB10241024=4GB。
虚拟地址48到63这16位是根据第47位来决定的,47位为1,它们就为1,反之为0,这是因为x86 CPU 并没有实现全64位的地址总线,而是只实现了48位, 但是CPU的寄存器却是64位的。
4MB
该分页方式下,32位虚拟地址被分为两个位段:页表索引、页内偏移,只有一个页目录、其中包含1024个条目,其中一个条目指向一个物理页,每个物理页4MB,正好是4GB的地址空间,4MB*1024=4GB。
长模式下的分页
4KB
64位虚拟地址被分为6个位段:保留位段、顶级页目录索引、页目录指针索引、页目录索引、页表索引、页内偏移,顶级目录、页目录指针、页目录、页表各占有4KB大小,其中每个各有512个条目,每个条目8字节64位大小。
2MB
64位虚拟地址被分为5个位段:保留位段、顶级页目录索引、页目录指针索引、页目录索引、页内偏移,顶级页目录、页目录指针、页目录各占用4KB大小,其中各有512个条目,每个条目8字节64位大小。
长模式下2MB和4KB分页的区别:2MB分页下是页目录项直接指向2MB大小的物理页面,放弃了页表项,然后把虚拟地址的低21位作为页内偏移,21位正好索引2MB大小的地址空间。
开启MMU的步骤:
- 使CPU进入保护模式或者长模式
- 准备好页表数据,包含顶级页目录,中间页目录,页表
- 把顶级目录的物理内存地址赋值给CR3寄存器
- 设置CPU的CR0的PE位为1,这样就开启MMU
MMU转换失败如何处理:
- MMU停止转换地址
- MMU把转换失败的虚拟地址写入CPU的CR2寄存器
- MMU触发CPU的14号中断,使CPU停止执行当前指令
- CPU开始执行14号中断的处理代码,代码会检查原因,处理好页表数据返回。
- CPU中断返回继续执行MMU地址转换失败时的指令。
网友评论