BUAA操作系统lab3

Cdostan MVP++

Lab3实验报告

一、思考题

Thinking 3.1

请结合MOS中的页目录自映射应用解释代码中e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义
从虚拟地址UVPT开始往上到ULIM之间是进程自己的页表,因此在二级页表映射机制当中,页目录中也应该含有自己本身的相关映射,由虚拟地址可知其在页目录中的第[PDX(UVPT)]项中,因此做代码中的赋值,本质上是让进程可以真正访问自己的页目录和页表。

Thinking 3.2

elf_load_seg 以函数指针的形式,接受外部自定义的回调函数 map_page。请你找到与之相关的data这一参数在此处的来源,并思考它的作用。没有这个参数可不可以?为什么?
该参数是由elf_load_seg传递给map_page的,data的作用是传递进程控制块以及其内部的属性,让相关的插入等操作得以实现。该参数使用void*的方式定义,能够很大程度上提升其复用性,较为方便。没有这个参数是不可以的,这样回调函数的需求得不到满足。

Thinking 3.3

结合 elf_load_seg 的参数和实现,考虑该函数需要处理哪些页面加载的情况
如果段头地址未对齐,首先加载其数据在内存中起始位置bin所处的那一页。之后会加载所有数据内容。如果该段在文件中的大小小于其在内存中的大小,则一直分配和加载页面到该段在文件中大小不小于其在内存中大小为止。

Thinking 3.4

你认为这里的env_tf.cp0_epc存储的是物理地址还是虚拟地址?
结合mips汇编的异常中断处理及Lab2内容容易知道,env_tf.cp0_epc存储的应该是虚拟地址。

Thinking 3.5

试找出0、1、2、3号异常处理函数的具体实现位置
它们的实现位置在kern/genex.S

Thinking 3.6

阅读entry.S、genex.S和env_asm.S这几个文件,并尝试说出时钟中断在哪些时候开启,在哪些时候关闭
发生时钟中断的时候,首先跳到异常分发程序,检测发生了那种异常,针对时钟中断,应该检测出0号异常,通过handle_int函数处理,handle_int函数根据Cause寄存器的值判断是否是Timer对应的7号中断位引发的时钟中断,如果是,则执行中断服务函数timer_irq,跳转到schedule中执行

Thinking 3.7

阅读相关代码,思考操作系统是怎么根据时钟中断切换进程的。
由schedule函数的实现逻辑可以看出,每次产生时间中断,操作系统都会将相应进程的时间片长度减1,当一个进程时间片长度为0时,便切换当前进程到调度队列的首个进程,并通过env_run方法运行它。

二、难点分析

由于在上一次实验中渐渐熟悉了对链表宏的使用以及相关地址的转换,所以本次实验的难度较上次没有那么大,但我认为仍有以下一些难点:

  • 对用户空间和内核空间的认识
  • 对每一个进程的地址空间的认识
  • 对回调函数的实现和作用的理解
  • 对异常与中断和进程之间的联系的理解

三、实验体会

在Lab3中,我学会了操作系统是怎么去创建进程、管理进程、运行进程、切换进程的。由于在Lab2中有大量的链表宏的使用,因此逐渐对其熟悉,所以这次在Lab3中再次遇到大量使用链表宏的情况下,我不再像Lab2那样手足无措了,因此本次作业写得也会比上一次轻松不少。但完成实验代码是一方面,理解Lab3的内容又是另一方面。我认为相较于Lab2的内容来说,本次的内容的理解难度完全不比上一次低,其实细究会发现上一次是有关操作系统管理内存的内容,这次是管理进程的内容,但其实这次有很多的实现还是和内存脱不了关系的,整个操作系统似乎都是围绕着内存来进行的,因此对内存管理有一个得当的理解和认识是很重要的。

  • Title: BUAA操作系统lab3
  • Author: Cdostan
  • Created at : 2025-04-19 17:10:00
  • Updated at : 2025-04-19 22:11:35
  • Link: https://cdostan.github.io/2025/04/19/OS/Lab3实验报告/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments