【OS】BUAA-OS-Lab3-实验报告

OS Lab3实验报告

思考题

Thinking 3.1

请结合MOS中的页目录自映射应用解释代码中e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义。
答:PADDR(e->env_pgdir) | PTE_V是进程页目录的物理地址被赋予有效,PDX(UVPT)是用户虚拟页表基地址对应的页目录索引,该代码意为将进程页目录中对应在UVPT虚拟地址范围的页目录项,指向页目录自身的物理地址,并标记为有效。这样做可以使得用户可以不切换内核态便可实现对内存映射的只读查询。同时便于操作系统统一管理。

Thinking 3.2

elf_load_seg 以函数指针的形式,接受外部自定义的回调函数 map_page。 请你找到与之相关的data这一参数在此处的来源,并思考它的作用。没有这个参数可不可以?为什么?
答:data具体在回调函数中会使用:

1
static int load_icode_mapper(void *data, u_long va, size_t offset, u_int perm,const void *src, size_t len){}

其中data指向的是当前进程的Env,其中有着当前进程的页表基地址、ASID等很多私有化信息,通过data指针可以使回调函数可以访问到这些私有信息,所以不能没有data。

Thinking 3.3

结合 elf_load_seg 的参数和实现,考虑该函数需要处理哪些页面加载的情况。
答:页面加载时可能出现以下情况:

  • ELF 段的虚拟地址va可能未按页对齐
  • 段中剩余的文件内容bin_size需要按完整页PAGE_SIZE映射
  • 段的内存大小可能大于文件大小,需用零填充剩余部分
  • 根据p_flags设置页表权限
  • 回调函数处理映射内容到va或分配零页到va

Thinking3.4

思考上面这一段话,并根据自己在Lab2中的理解,回答:你认为这里的env_tf.cp0_epc存储的是物理地址还是虚拟地址?
答:虚拟地址

Thinking3.5

试找出0、1、2、3号异常处理函数的具体实现位置。8号异常(系统调用) 涉及的do_syscall()函数将在Lab4中实现。
答:handle_int在genex.S中,handle_sys在syscall.S中。handle_mod和handle_tlb在genex.S中通过宏函数BUILD_HANDLER实现。

Thinking3.6

阅读entry.S、genex.S和env_asm.S这几个文件,并尝试说出时钟中断在哪些时候开启,在哪些时候关闭。
答:
开启:

  • 内核完成初始化时
  • 异常或中断处理完成返回时
  • 进程切换时
    关闭:
  • 进程正在进行切换时
  • 处理异常或中断时
  • 处理页表错误时

Thinking 3.7

阅读相关代码,思考操作系统是怎么根据时钟中断切换进程的。
答:进程块由env_free_list和env_sched_list管理,时钟中断发生时,检查当前进程是否已运行完时间片或者不再就绪,此时进程切换到调度进程链表的第一个进程,如果原来的进程仍处于可运行状态,则将其放回调度进程链表的末尾。

难点分析

这次实验难点主要在于进程的管理和时钟中断触发的进程切换,其实只需要明白了进程的工作逻辑,再结合实验代码便可很轻松地理解这部分内容

实验体会

Lab3相比于Lab2简单了许多,这次的学习内容大多均是线性的,从头到底地去学习进程的相关知识,学习体验相比于上一个Lab提高了很多

原创性说明

本报告为本人原创


【OS】BUAA-OS-Lab3-实验报告
http://example.com/2025/04/25/【OS】BUAA-OS-Lab3-实验报告/
作者
mRNA
发布于
2025年4月25日
许可协议