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

地址映射与共享

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

实验日期:2022年5月31日

班级:软嵌201

姓名:王威

学号:2030110750

一.实验目的

1.深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念;

2.实践段、页式内存管理的地址映射过程;

3.编程实现段、页式内存管理上的内存共享,从而深入理解操作系统的内存管理。

二.实验环境

硬件环境是 IA-32(x86) 架构的 PC 机(在实验楼的环境中就是右侧的窗口),主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码

三.实验内容

1.用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32 和 Linux 0.11 的内存管理机制;

2.在 Ubuntu 上编写多进程的生产者—消费者程序,用共享内存做缓冲区;

3.在信号量实验的基础上,为 Linux 0.11 增加共享内存功能,并将生产者—消费者程序移植到 Linux 0.11。

四.实验过程及数据记录

1.准备实验环境 tar -zxvf hit-oslab-linux-20110823.tar.gz
-C /home/shiyanlou/ 图片描述 2.挂载虚拟机,建立test.c(hdc/usr/root) 图片描述 2.1打开bochs 图片描述 2.2编译test.c,获取ic 图片描述 2.3暂停test.c,将i保存在ds:0x3004 图片描述 2.4使用命令“u /7”,显示从当前位置开始7条指令的反汇编代码 图片描述

3.寻找ds对应的物理地址

3.1用sreg命令 图片描述 3.2xp /32w 0x00005cb8查看GDT表的前16项 图片描述 3.3使用命令:xp /2w 0x00005cb8 + 5*8查找的是GDT表的5号位置 图片描述 3.4输入命令 xp /8w 0x0001a410 图片描述 3.5ds:s=0x0010段描述符 图片描述

4.虚拟地址ds:0x3004所对应线性地址,用“calc ds:0x3004”命令 图片描述 4.1 0x00003004的页目录号是0,页号3,页内偏移是4。页目录表的位置由CR3寄存器指引。用命令“creg” 图片描述 4.2CR3 = 0x00000000说明页目录表的基址为0。看看其内容,“xp /68w 0” 图片描述 4.3页目录号为0,xp /w 0+04 图片描述 4.4页表号3,xp /w 0x00001000+34,0x00003是物理页框号 图片描述 4.5物理地址0x00003004 图片描述 图片描述

5.通过内存直接修改i值,用命令setpmem 0x00003004 4 0 图片描述

6.创建producer.c 图片描述 图片描述 图片描述

7.创建consumer.c 图片描述 图片描述 图片描述

8.创建shm.c 8.1添加结构体定义(oslab/linux-0.11/include/unistd.h) 图片描述 8.2添加系统调用号 图片描述 8.3添加函数声明(oslab/linux0.11/include/linux/sys.h) 图片描述 图片描述 8.4改写系统调用数(oslab/linux0.11/kernel/system_call.s) 8.5编写shm.c 图片描述 图片描述 图片描述 图片描述 8.6修改makefile 图片描述 图片描述

五.实验结果分析

修改成功 图片描述 运行结果 图片描述 图片描述 图片描述

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

(1)获得程序中变量i的逻辑地址:ds:3004 (2)查LDT表得到段描述符:“0xa4100068 0x00008201” (3)通过段描述符得到线性地址:0x00003004 (4)查页表得到物理地址:0x00003004

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

逻辑地址和虚拟地址不变,页目录地址是操作系统放置的, 物理分页变了,所以物理地址变了。原因是每次进程加载后都有64M的虚拟地址空间,导致段基址不同。 而数据段偏移量不变,这是编译时就设置完毕的。

六.实验心得

shm.c的实现过程,运用到前几个实验的知识点。实验虽然看起来艰深难懂,但只要静下心来,还是能够慢慢做出来的。实验过程中不可避免的遇到很多问题,有些问题可能只是一个小细节的疏忽,就会多耗上好几个小时去排查。

最新评论
暂无评论~