“操作系统实验”实验报告

地址映射与共享

实验名称:地址映射与共享

  • 实验日期:7.5
  • 班级:物联网193
  • 姓名:杨佳佳
  • 学号:1930110723

一、实验目的

深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念; 实践段、页式内存管理的地址映射过程; 编程实现段、页式内存管理上的内存共享,从而深入理解操作系统的内存管理。

二、实验环境

hit-oslab 实验环境

三、实验内容

本次实验的基本内容是: 用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32 和 Linux 0.11 的内存管理机制; 在 Ubuntu 上编写多进程的生产者—消费者程序,用共享内存做缓冲区; 在信号量实验的基础上,为 Linux 0.11 增加共享内存功能,并将生产者—消费者程序移植到 Linux 0.11。

四、实验过程及数据记录

1、 IA-32 的地址翻译过程 图片描述

2、挂载hdc,用 Bochs 汇编级调试功能进行人工地址翻译 在/usr/root目录下添加test.c文件用来测试地址映射: 图片描述

通过运行 ./dbg-asm 启动调试器: 图片描述

输入c使bochs继续并编译test.c 图片描述

这里出现的是逻辑地址。接下来我们来寻找其物理地址。 在命令行中按Ctrl+c ,暂停Bochs的运行,进入调试状态。命令行中显示如下信息 图片描述

用 n 命令单步运行几步,直到停在 cmp ... : 图片描述

使用命令 u /8,显示从当前位置开始 8 条指令的反汇编代码 图片描述 这就是 test.c 中从 while 开始一直到 return 的汇编代码。变量 i 保存在 ds:0x3004 这个地址,并不停地和 0 进行比较,直到它为 0,才会跳出循环。现在,开始寻找 ds:0x3004 对应的物理地址。

用 xp /32w 0x00005cb8 查看从该地址开始,32 个字的内容,及 GDT 表的前 16 项 图片描述

GDT 表中的每一项占 64 位,所以我们要查找的项的地址是 0x00005cb8+138。 输入 xp /2w 0x00005cb8+138,就是 LDT 表的前 4 项内容了。 图片描述

段基址+段内偏移,就是线性地址。所以 ds:0x3004 的线性地址就是0x10000000 + 0x3004 = 0x10003004

物理地址 在IA-32下,页目录表的位置由CR3寄存器指引,用creg命令可以看到

图片描述

查看内容:xp /68w 0,通过 setpmem 0x00fa7004 4 0,改变 i 的值为 0。然后用“c”命令继续 Bochs 的运行,可以看到 test 退出了,说明 i 的修改成功了: 图片描述

3、 在 Linux 0.11 中实现共享内存

修改unitsd.h文件:

图片描述

修改sys.h文件 图片描述

添加shm.c 图片描述

修改Kernel下的Makefile文件 图片描述 图片描述

编写生产者消费者,运行bochs,输入: gcc -o pro producer.c gcc -o con consumer.c 编译这两个程序, 然后输入 pro > proOutput & con > conOutput & 来同时运行这两个程序,并将结果保存到proOutput和conOutput中。 最后输入sync。

图片描述

五、实验结果分析

用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程正确,在 Ubuntu 上编写多进程的生产者—消费者程序,用共享内存做缓冲区,结果正确无误;在信号量实验的基础上,为 Linux 0.11 增加共享内存功能,并将生产者—消费者程序移植到 Linux 0.11,运行结果正确。

问题: 7.1 对于地址映射实验部分,列出你认为最重要的那几步(不超过4步),并给出你获得的实验数据。

答:第一步为找到需要的各个选择符,DS:S=0X0017,LDT:s=0x0068,GDT:BASE=0X0000 5CB8。第二步为找到数据段的基址。实验中进程的NR为4,即第5个进程,所以按照LINUX 0.11的设计,其基址应为 4*64M,转换为16进制即为0x1000 0000。实验结果也验证了这一点。第三步根据找到的线性地址,通过查看页目录表就可以找到对应页表的物理地地址。实验中页表的物理地址为0x00fa 70000。 第四步根据找到的页表所对就应的物理地址就可以找到变量所在页的物理地址。实验中变量所在页的物理地址为0x00fa6000。这里有个很有趣的现象,页表的物理地址比具体一页的物理地址高。而页表一定是先分配的内存,这也说明linux 0.11中物理内存的分配是从高到低进行的。这一点通过查看get_free_page函数得到印证。

7.2 test.c退出后,如果马上再运行一次,并再进行地址跟踪,你发现有哪些异同?为什么?

答:若马上再运行一次,则可以看到得到的线性地址为0x1400 3004,即进程的数据段基地多了0x0400 0000。就是多了一个64M。这也正是linux 0.11中对进程线性地址分配的方法即:nr*64M。因为马上运行此时进程4并没有被删除,而只是状态个性为3,所以再运行的进程正好是5。所以其分配的线性地址基址为0x1400 0000。

六、实验心得

这次实验,使我更深入理解了操作系统的段、页式内存管理,段表、页表、逻辑地址、线性地址、物理地址等概念,操作系统的内存管理。并且这次实验建立在之前实验的基础上,又加深了印象,方便以后的学习。

最新评论
暂无评论~