虚拟地址与物理地址
1,虚拟地址由链接器产生,代码经过编绎,由链接器将多个代码模块链接成可执行文件,解决模块之间代码的地址引用,形成程序运行的静态内存空间视图。
2,每个应用程序的虚拟地址空间都是相同且独立的,根据操作系统的不同,虚拟地址定义也许不同。
3,虚拟地址只是逻辑上存在的地址,无法作用于硬件电路,程序运行于内存,从内存获取指令和数据,而内存只认物理地址。
4,物理地址逻辑上是一个数据,由地址译码器等电子器件变成电子信号,放到地址总线上,地址总线上电子信号的各种组合就可以选择到内存的储存单元。
1)地址总线上的信号也可以是别的设备的储存单元,如显卡的显存、I/O设备的寄存器、网卡的网络缓存器等。
虚拟地址到物理地址的转换
1,内存管理单元MMU通过地址关系转换表将虚拟地址空间转换成物理地址空间,地址关系转换表存放在物理内存中。
1)虚拟地址空间和物理地址空间分成同等大小的块,称为页,按照虚拟页和物理页进行转换。
2)现代内存管理模式,分页模型,一个虚拟页对应一个物理页,页大小一经配置即为固定,在地址关系转换表中,存放虚拟页地址对应的物理页地址。
2,内存管理单元MMU,是硬件电路逻辑实现的地址转换器件,接受虚拟地址和地址关系转换表,输出物理地址。
3,MMU可以是独立芯片,也可以集成在其它芯片内部。
1)X86、ARM系列MMU集成在CPU中,x86 CPU开启MMU,必须先开启保护模式或者长模式,实模式下不能开启MMU。
2)而保护模式的内存模型是分段模型,不适合MMU的分布模型,所以要使用保护模式的平坦模式,绕过分段模型,平坦模型和长模式下忽略段基址和段长度。
3)虚拟地址经过CPU的分段机制产生线性地址,平坦模式和长模式下线性地址和虚拟地址是相等的,保护模式下如果不开启MMU,线性地址就是物理地址,长模式下分段弱化了地址空间的隔离,必须开启MMU,才能访问内存地址空间。
MMU页表
1,地址关系转换表,即页表,描述了虚拟地址到物理地址的转换关系,是虚拟页到物理页的映射关系,称为页表。
2,页表不存放虚拟地址和物理地址的对应关系,只存放物理页面的地址,MMU以虚拟地址为索引查表返回物理页面地址。
3,页表是分级的,一个顶级页目录,多个中级页目录,最后是页表。虚拟地址中第一个位段索引顶级页目录中一项,该项指向一个中级页目录,第二个位段索引该中级页目录中一项,该项指向一个页目录,第三个位段索引该页目录中的项,该项指向一个物理页地址,最后用第四个位段作为该物理页内的偏移访问物理地址。
保护模式下的分页
1,x86 CPU的分页,保护模式下只有32位地址空间,最多4GB-1大小的空间,32位虚拟地址经过分段机制后得到线性地址。
1)又因为平坦模式,线性地址和虚拟地址相同,分页大小一种是4KB的页,一种是4MB的页。
2)分页大小不同虚拟地址位段的分隔和页目录层级不同,但虚拟页和物理页大小始终是相同的。
2,保护模式下4KB页
1)该分页方式下,32位虚拟地址分为:页目录索引10位、页表索引10位、页内偏移12位,一级页目录包含1024项页目录,每个页目录指向一个页表,每个页表有1024项物理页,每个物理页4KB,共有1024*1024个物理页,正好是4GB地址空间。
2)CR3寄存器指向页目录基地址,页目录项、页表项、物理页地址始终是对齐的,所以高20位表物理基地址,根据一层层索引找到物理页,物理页大小4KB,12位地址长度, 低12位可以另作它用,如是否可读可写、是用户页还是内核页等,形成页面的相关属性。
3,保护模式下4MB页
1)该分页方式下,32位虚拟地址分为:页表索引10位、页内偏移22位,一级页目录包含1024项物理页,每个物理页4MB,正好是4GB地址空间。
2)页表项还是4字节32位,只需要高10位保存物理页面的基地址。
长模式下的分页
1,如果开启了长模式,则必须同时开启分页模式。
1)长模式弱化了分段模型,同时扩展了CPU位宽,虚拟地址必须等同于线性地址且为64位。
2)长模式下的分页为4KB大小页和2MB大小页。
2,长模式下4KB页
1)该分页方式下,64位虚拟地址分为6个位段:保留位段16位、顶级页目录索引9位、页目录指针索引9位、页目录索引9位、页表索引9位、页内偏移12位,顶级页目录、页目录指针,页目录、页表各有512项内容占有4KB大小。
2)由顶层目录、二级中间层目录和一层页表组成64位地址翻译过程,顶级页目录指向页目录指针页,页目录指针项指向页目录页,页目录项指向页表页,页表项指向4KB大小物理页,各级页目录和页表项中依然存在属性位。
3,长模式下2MB页
1)在这种分页方式下,64位虚拟地址分为5个位段:保留位段16位、顶级页目录索引9位、页目录指针索引9位、页目录索引9位、页内偏移21位,顶级页目录、页目录指针、页目录各有512项内容占有4KB大小。
2)长模式下2MB分页的页目录项直接指向了2MB大小的物理页面,放弃了页表项,虚拟地址的低21位作为页内偏移。
3)物理页始终2MB对齐,所以低21位可用于存放页面属性。
4,CPU进入保护模式或长模式,准备好页表数据,包含顶层页目录,中间层页目录,页表,将顶级页目录的物理内存地址赋值给CR3寄存器,设置CPU的CR0的PE位为1,开启MMU。
5,MMU地址转换失败,若页表项中数据为空,或用户程序访问了超级管理者的页,或向只读页面写入数据,都会导致MMU地址转换失败。
6,转换失败后MMU停止转换地址,将转换失败的虚拟地址写入CPU的CR2寄存器,MMU触发CPU的14号中断,CPU停止执行当前指令,CPU执行14号中断的处理代码,检查失败原因,处理好页表数据返回,CPU中断返回继续执行MMU地址转换失败时的指令。