实验日期: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的实现过程,运用到前几个实验的知识点。实验虽然看起来艰深难懂,但只要静下心来,还是能够慢慢做出来的。实验过程中不可避免的遇到很多问题,有些问题可能只是一个小细节的疏忽,就会多耗上好几个小时去排查。
学习时间 328分钟
操作时间 102分钟
按键次数 908次
实验次数 9次
报告字数 5224字
是否完成 完成