操作系统 lab2 实验报告
李丙昕 1611500
摘 要
本文第一部分先总结了 lab2 中比较重要的知识点,以及在我们练习过程中问题
的扩展内容;后半部分是解决文档中的问题以及挑战。
关键词:虚拟内存、物理页面、页表、地址
目 录
1 核心知识整理 .............................................................................................................................................................. 2
1.1 物理页面管理 ................................................................................................................................................. 2
1.2 虚拟内存 .......................................................................................................................................................... 4
1.3 内核地址空间 ................................................................................................................................................ 10
2 练习 .............................................................................................................................................................................. 11
2.1 练习一 ............................................................................................................................................................. 11
2.2 练习二 ............................................................................................................................................................. 15
2.3 练习三 ............................................................................................................................................................. 15
2.4 问题一 ............................................................................................................................................................. 16
2.5 练习四 ............................................................................................................................................................. 16
2.6 练习五 ............................................................................................................................................................. 20
2.7 问题二 ............................................................................................................................................................. 21
2.8 挑战 ................................................................................................................................................................. 22
1 核心知识整理
1.1 物理页面管理
在做完 lab1 以后,我们知道了在实模式下物理页面前 640KB 的一些分配情况,
如 BIOS 的载入地址、BootLoader 载入地址、操作系统内核 ELF 文件头的临时存放空
间等待,具体的布局如下图所示:
图 1:lab1 物理内存布局
在 lab1 完成后,我们从 0x100000 这个位置放入内核,直到 end 结束。end 是链
接器作链接时得到的内核结束地址。在 mem_init 函数中,我们需要为 pages 分配实
际的物理内存空间,在二级页地址映射机制中,系统还需要一个页目录存下所有二级
页表的地址,这个也是需要操作系统预先分配空闲。
图 2:页面管理空间的放置
此外,我们还需要了解 PageInfo 和 pages 和 page_free_list 的相关知识:
图 3:PageInfo 的结构信息
PageInfo 是一个结构体,它保存了该物理页面的被引用次数和指向的下一个页面
地址的信息,每个 4K 大小的物理页面对应一个该结构体,一共有 npages=物理内存的
大小/4K 个。pages 是一个由所有物理页面组成的数组,每一项都是一个 PageInfo 的
结构,我们遍历这个数组,将那些空页利用 PageInfo 的第一个变量像链表那样连在
一起,其余的指向 NULL,就可以形成一个由所有空闲页面组成的链表 page_free_list,
每次需要分配物理页面的时候从这个链表中获取即可。
图 4:pages 原理图
最后,为了方便阅读和理解代码,我们需要明白下面三个函数的实现:
图 5:物理页面结构到地址的相互转换
page2pa()
这个函数实现了从一个物理页面结构到对应物理地址的转换,具体是通过 pp-
pages 得到一个偏移量,这个偏移量就是 pp 在物理内存中所对应的页号,再左移 12
位,相当于乘以 4K,因为 pages 是这个 PageInfo 结构数组的开始,它对应的物理内
存是 0x00000000,页号乘以 4K 便是这个物理页的起始地址。
pa2page()
这个函数实现了从一个物理地址到物理页面的转换,具体利用该地址的前 22 位,
也就是它在物理页面的页号,同时也是 pages 数组的索引。例如,一个拥有 2MB 的计
算机,它一共有 2MB/4KB=512 个物理页面,那么 pages[100]就引用的是物理内存
0x64000 到 0x65000 的物理页面所对应的页面管理链表节点。
page2kva()
这个函数实现了从一个物理页到内核虚拟地址的转换,具体是先将利用 page2pa 找到
对应的物理地址,然后再将这个物理地址转换成内核虚拟地址,它们之间相差了
0xf0000000,也就是 KADDR 的功能。
1.2 虚拟内存
在做实验之前,再来回顾下 x86 保护模式下内存管理架构:分段和分页。再来看看虚
拟地址(逻辑地址),线性地址和物理地址之间的区别。
图 6:地址转换简图
图 7:虚拟寻址
我们代码中的 C 指针就是虚拟地址中的 offset,根据描述符表和段选择子
(selector),通过分段机制转换为线性地址,因为 JOS 中设置的段基址为 0,所以线
性地址就等于 offset。在未开启分页之前,线性地址就是物理地址。而在我们开启
分页之后,线性地址经过 CPU 的 MMU 部件的页式转换得到物理地址。
开启分页后,当处理器碰到一个线性地址后,它的 MMU 部件会把这个地址分成
3 部分,分别是页目录索引(Directory)、页表索引(Table)和页内偏移(Offset),
这 3 个部分把原本 32 位的线性地址分成了 10+10+12 的 3 个片段。每个页表的
大小为 4KB(因为页内偏移为 12 位)。过程如下图所示:
下面我们再来看一下虚拟内存的布局,在 inc/memlayout.h 中有如下注释图:
图 8:地址转换流程
图 9:虚拟内存空间分布图
图 10:虚拟内存空间分布直观图
这个页面布局代表的是启用地址转换以后,无论是操作系统还是用户程序,看到的虚
拟内存布局(也就是说,操作系统和用户程序使用的是同一套页目录和页表),那么这
个虚拟地址和我们再前面图二看到的实际物理页面布局之间有什么联系呢?我们先
来看看这个页表里有哪些组成部分:
[UTEXT,USTACKTOP):
用户程序的.text 段以及用户堆栈共用区域,两个区域从两头向中间生长。
[UPAGES,UVPT):
在虚拟内存中这段内存对应的在实际物理地址里 pages 数组对应存储位置。可以
看到这段地址在 ULIM 之下,也就是说操作系统开放 pages 数组便于让用户程序可以
访问。
[UVPT,ULIM):
这个地址映射的是系统页目录,即原来在程序中看到的变量 pgdir,开放给用户