打印进程地址转换过程
实验目的
- 深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念;
- 实践段、页式内存管理的地址映射过程;
- 编程打印特定进程地址转换过程。
知识储备
线性地址和物理地址之间的变换
页目录和页表的表项格式
主内存区域
进程代码和数据在其逻辑地址空间中的分布
实验过程
修改sys.h
把debug_paging函数声明为全局变量,添加中断函数表。
修改系统调用函数
把对应的函数个数进行修改
增加系统调用号
需要在unistd.h
中修改,注意进行挂载。
运行 sudo ./mount-hdc
可以把虚拟机硬盘挂载在 oslab/hdc
目录下。
在 hdc/usr/include
目录下修改 unistd.h
新增debug_paging.c文件
将完成的文件放入linux-0.01/kernel 目录下
修改makefile
编写test.c
实现fprintk
实验结果
问题回答
- 页表中正在使用的页表项是连续的吗?这体现了分页的什么优点?
1 | 不是。可以充分利用碎片的内存空间,提高空间利用率。 |
- 你觉的分段是必要的吗?现在的
Linux (x86-64)
是怎么处理分段的?
1 | 不是。在64位模式下:处理器把CS/DS/ES/SS的段基都当作0,忽略与之关联的段描述符中的段基地址。因为在64位模式中,CPU可以访问所有可寻址的内存空间。x86工作在保护模式下时,分段单元将逻辑地址转换成线性地址,分页单元(MMU开启情况下)将线性地址转换成物理地址。当CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址,在x86_64上,处理器把CS/DS/ES/SS的段基都当作0,实际上摒弃了段式管理,不再使用。指令中使用的地址就是线性地址,当CPU开启MMU时,通过页式管理单元翻译成物理地址。 |