目录
一、实验目的
分析XV6教学系统分页存储地址变换的实现
二、具体任务安排
1.理解XV6内核源码
(1)阅读学习通资料中的XV6 guide book第一、第二章或自行查阅相关资料,了解XV6系统初始化阶段内存的分配以及分页式内存管理的实现。
①英特尔分页体系结构
分页是比分段粒度更细的内存空间划分机制,开启分页机制后,处理器必须通过页管理机制才能将线性地址转换成物理地址。分页机制会将线性地址空间和物理地址空间都划分成固定大小的页面(通常是4KB),并通过MMU维护一套页转换表结构,完成线性地址空间页面到物理地址页面的映射和转换。
1)4KB页面的线性地址转换
在使用4KB页面的情况下,32-bit分页模式使用两级页表:页目录表PDT(Page Directory Table)和页表PT(Page Table)。
2)4MB页面的线性地址转换
4MB页面映射相对于4KB页面,本质上是减少了一级页表的转换,线性地址的高10位用于索引页目录表项,此时的页目录表项指向4MB的物理页面;线性地址剩余位作为4MB页面内的偏移。
②英特尔分页体系结构在xv6中的应用
页表是操作系统控制内存含义的机制。它允许xv6把一块物理内存映射到不同进程的地址空间,并保护进程各自的内存。页表提供的对物理内存的间接访问催生了很多技巧。xv6 主要使用页表来创建多个地址空间并保护内存。它也使用了几个简单的页表技巧:把一块内存(内核)映射到不同地址空间,在一个地址空间中映射同一块内存多次(每个用户页也映射到内核管理的物理内存),使用一个未映射的页给用户栈设定边界。
1)页表硬件
x86指令(包括用户与内核)操作虚拟地址。机器的RAM,或者叫物理内存,通过物理地址索引。x86页表硬件把这两种地址联系起来,把一个虚拟地址映射到一个物理地址。
x86页表逻辑上来说是一个2^20(1048576)个页表入口(page table entries,PTEs)的数组。每个PTE包含一个20位的物理页号码(physical page number,PPN)和一些标志位。页表硬件使用虚拟地址的高20位作为索引在页表中寻找一个PTE,然后把虚拟地址的高20位替换为PTE中的PPN。页表硬件把虚拟地址的低12位原封不动的拷贝到翻译后到物理地址。因此页表让操作系统以4096(2^12)字节对齐的块的粒度来控制虚拟地址到物理地址的翻译。这一个块就是一个页。
如图3所示,实际的翻译分为2步。页表以2级的树形结构保存在物理内存上。树根是一个4096字节的页目录(page directory),包含1024个关联到页表页(page table pages)的类似PTE的入口。每个页表页是一个包含1024个32位PTE的数组。页表硬件使用虚拟地址的高10位选择一个页目录入口。如果页目录入口存在,页表硬件使用虚拟地址接下来的10位从页目录入口代表的页表页里选择一个PTE。如果页目录入口或者PTE不存在,页表硬件产生一个错误。通常情况下大量的虚拟地址是没有进行映射的,这个两级结构允许页表删除整个页表页。
XV6总共拥有128MB的内存,内存地址从0x80000000开始,到0x88000000结束。内核程序本身占用一部分内存,而剩余部分则由内核以按需的方式管理。实际被管理的内存空间由多个4KB的页面组成。
每个PTE都包含标志位来告诉页表硬件相关的虚拟地址允许被怎样使用。PTE_P指出PTE是否存在:如果它没有设置,那么对这个页的引用会引起错误(也就是不被允许)。PTE_W控制指令是否能写入本页;如果没有设置,那么只能读取数据或者取指令。PTE_U控制用户程序能否使用这个页;如果此位清除,则只有内核可用使用这个页。图3展示了所有标志位的用法。标志位和所有其他页表硬件相关的数据结构定义在mmu.h(0700)。
2)进程地址空间
Entry创建的页表映射了足够的空间好让内核的C代码得以运行。然而,main通过调用kvmalloc(1840)直接切换到一个新的页表,因为内核有一个更精细的计划来描述进程地址空间。
每个进程有自己单独的页表,每当xv6切换进程时它会告诉页表硬件同时切换页表。如图4所示,每个进程的虚拟内存从0开始最大可到KERBASE,让进程可以使用高达2GB内存。memlayout.h声明了xv6的内存布局,以及把虚拟地址转为物理地址的宏。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



