在linux中32位的线性地址主要被分为三部分:高10位的页目录、中间10位的页表和低12位的偏移量。
线性地址的转换经过了页目录表和页表。常规分页使用二级分页的目的是为了减少每个进程所需的RAM数量。只为进程需要的虚存区进行页表请求分配。这里涉及到虚存区,对于进程空间的描述主要有两个数据结构:mm_struct对进程的整个用户空间进行描述和vm_area_struct对空间中的各个区间(虚存区)进行描述。
为什么进程会有的多个虚存区?每个进程虚存区的来源是不同的,有的来自可执行映射,有的来自动态分配的内存。对不同的虚存区有不同的管理权限。
回归正题,如果使用一级页表就要使用2的20个表项,需要4MB 空间来表示一个进程的页表。如果对多个进程进行分页就需要很大的RAM,而且这其中有的有的地址没有使用,但是也浪费了RAM。
因此没有必要马上为每个进程分配页表,页目录是必须分配的。只有在一个进程实际需要一个页表时才会为其分配以提高RAM的使用效率。
分页的执行步骤如下:
1、页目录的物理地址存放在控制寄存器CR3。
2、页目录中的字段决定了页目录中的目录项,而目录项又指向了页表。
3、页表中的字段又决定了页表中的页表项,而页表项含有页所在页框的物理地址
4、偏移量决定了页框内的相对位置。
对于不同的体系结构又有三级分页和四级分页,其中的主要原理是类似的。
阅读(255) | 评论(0) | 转发(0) |