飞腾CPU体系结构之虚拟地址
1. 基本概念
- 虚拟地址:程序运行时指令和数据对应的地址。
- 虚拟地址空间:一个进程运行时指令和数据能访问到的虚拟地址范围。
注意事项:
- 每个进程拥有自己的虚拟地址空间,进程的虚拟地址空间一般分为内核态和用户态两个范围。
- 进程内的所有线程共享该进程的虚拟地址空间。
- 进程和进程之间可以共享虚拟地址空间
- 内核态范围:所有进程共享虚拟地址空间的内核态范围全部;
- 用户态范围:
1.部分进程共享虚拟地址空间的用户态范围中的共享库部分;
2. 两个进程可以通过System V或POSIX等共享内存方式,获得用户态范围中的一部分。
2. 飞腾CPU虚拟地址空间
飞腾CPU硬件上支持最大虚拟地址宽度为48位,Linux操作系统内核可以支持36/39/42/47/48/52位虚拟地址,其中飞腾暂不支持52位虚拟地址。
整个64位虚拟地址空间分为三部分:内核态范围、地址空洞、用户态范围。其中内核态范围和用户态范围采用各自的页表,当进程上下文切换时,仅仅切换用户态页表,而内核态页表不动。
3. 虚拟页
飞腾CPU按照固定的长度将虚拟地址空间进行划分,每个固定长度的虚拟地址范围就是一个虚拟页。虚拟页有两个特点:
- 虚拟页内地址单元的所有访问属性都一致;
- 虚拟页内地址单元对于相同的物理页帧。
查看虚拟内存页长度
getconf PAGE_SIZE
地址范围的访问
飞腾CPU对虚拟地址空间的访问受限于CPU的权限级
- 当飞腾CPU处于EL1权限(操作系统内核)时,飞腾CPU可以取指令的地址范围不受限制(除了地址空洞),读写数据的地址范围也不受限制(除了地址空洞)。
- 当飞腾CPU处于EL0权限(应用程序)时,飞腾CPU可以取指令的地址范围受限于用户态范围,读写数据的地址范围也受限于用户态范围。
当飞腾CPU处于EL0权限时,飞腾CPU超出用户态范围访问时,飞腾CPU会触发地址异常。
注意:地址范围访问过程忽略了地址的页属性。
页属性
页属性是对访问操作类型进行限制的,页属性包括执行、读、写、缓冲操作、写合并操作、对齐要求等等。