"山东大学操作系统实验7和实验8的实验报告"
在本次山东大学的操作系统实验课程中,实验7和实验8主要围绕着地址空间的扩展和系统调用`Exec()`、`Exit()`的实现展开。实验由2010级软件工程三班的李志强同学完成,日期为2012年11月24日。
实验目的:
1. 扩展Nachos操作系统的地址空间机制,使其能支持多用户程序的运行。这通常涉及到进程管理和内存管理的深入理解,包括虚拟地址到物理地址的映射、内存分配和释放等。
2. 为地址空间类`AddrSpace`添加打印函数。这个功能有助于调试和理解系统中各个进程的内存布局,便于分析和优化。
3. 实现`Exec()`系统调用,用于在当前进程中替换程序,执行新的程序。这涉及到文件系统、内存管理和进程上下文的切换等多个方面。
4. 实现`Exit()`系统调用,允许一个进程结束自己的执行并释放其占用的资源。这是操作系统中进程管理的基础部分,确保系统资源的有效利用。
实验环境:
实验是在VMware虚拟机中的Linux操作系统环境下进行的,使用了Nachos-3.4这一开源操作系统模拟器。Nachos是一个用C++编写的教学操作系统,它提供了一个平台,让学生可以在其中学习和实现操作系统的基本概念。
实验步骤:
实验的实施包括了一系列的编程和编译工作:
1. 首先,对实验内容进行了预习,理解实验要求和目标,通过查阅资料做好准备。
2. 编写`exec.c`文件,这是实现`Exec()`系统调用的关键部分,可能包括读取磁盘上的可执行文件、解析文件格式、分配内存空间、设置程序计数器等步骤。
3. 修改`Makefile`,将新编写的`exec.c`加入到编译目标中,确保编译时包含这部分代码。
4. 在`userprog`路径下的`AddSpace`类中添加`Print`函数,这用于显示地址空间的详细信息,如内存块的分配情况、页表等。
5. 更新`AddSpace.cc`文件,实现`Print`函数的具体逻辑,可能涉及遍历地址空间的数据结构,输出相关信息。
6. 修改`Exception.cc`文件,集成`Exec()`和`Exit()`的处理逻辑,这通常需要处理异常情况,比如内存访问错误、权限问题等,并在适当的时候调用这两个系统调用。
实验分析与思路:
实验的核心是理解和扩展操作系统的核心机制,特别是进程管理和内存管理。通过`Exec()`,学生需要理解如何在不丢失现有数据的情况下替换进程的代码和数据段。而`Exit()`则涉及进程生命周期的结束,包括清理资源、更新进程状态以及可能的通知父进程。
实验结果:
实验的结果部分通常会展示系统调用成功执行后的一些输出信息,包括地址空间的打印结果、`Exec()`调用后程序正确替换的验证,以及`Exit()`调用后进程正确终止的确认。此外,测试环节会包括一系列的测试用例,以验证`Exec()`和`Exit()`的正确性和健壮性。
心得与体会:
在实验过程中,学生不仅锻炼了编程技能,更深入地理解了操作系统内核的工作原理,特别是进程管理和内存管理的细节。这有助于提升解决问题的能力,为后续的系统编程和操作系统研究打下坚实基础。
总结,山东大学的操作系统实验7和实验8是一次深入实践操作系统核心概念的机会,通过这样的实验,学生能够将理论知识与实际操作相结合,增强对操作系统的理解和应用能力。