首页 > 其他分享 >lab4实验报告

lab4实验报告

时间:2023-03-14 16:46:31浏览次数:49  
标签:调用 用户 空间 内核 lab4 进程 实验报告 页面

lab4实验报告

一、实验思考题

Thinking4.1

保存现场过程中改写非通用的寄存器,SAVE_ALL将所有通用寄存器的值存入栈中。一些其他的寄存器,如k0存储sp的值,k1存储帮助sp更新值,v0存储部分非通用寄存器相关的值。所以可以避免破坏通用寄存器。

可以直接获取,在处理相关系统调用时,a0-a3的值还没有改变。

在调用sys相关的函数时,通过将前4个参数赋值给对应的寄存器上,后续参数保存在栈中的对应位置。

修改epc的值以便返回时可以继续执行下一条指令,将执行结果返回值存入v0寄存器,从系统调用返回时,用户态获取系统调用的返回值,并且可以继续执行下一条指令。

Thinking4.2

  • 子进程和父进程之间共享代码段,并且具有相同的数据和状态,所以子进程和父进程的代码段是一样的
  • 子进程恢复上下文时的位置在fork()函数,创建时保存父进程的上下文和pc值,所以不执行fork()之前的代码。

Thinking4.3

C

fork只在父进程中被调用了一次,在两个进程中各产生一个返回值

Thinking4.4

在空间0-USTACKTOP中,非共享的页面或者只读的页面不用保护,其他需要duppage保护起来。

具体有一些空间,UTOP之上的空间用户进程不应操作,无需保护。UXSTACKTOP用户进程异常栈,无需保护。USTACKTOP + BY2PG显示Invalid memory无需保护。

Thinking4.5

vpt指向二级页表,即页表项。vpd指向一级页表,即页目录。类似于数组或者指针的操作(*vpd) [va >> 22](*vpt) [va >> 12]。可以分别取页表项物理地址和va对应的物理地址。

entry.S

vpd:     
     .word (UVPT+(UVPT>>12)*4) 

注意到计算vpd即页目录地址,体现了自映射。

获取了地址一般可以修改,但是用户进程没有访问权限。

Thinking4.6

写时复制机制下,如果页面有COW则需要进行中断重入。

用户态中需要处理中断,读取Trapfram中的值,并且利用相关数据来恢复现场。

Thinking4.7

  • 符合微内核的思想,用户空间可以临时执行内核的功能,当内核出现故障时操作系统不至于崩溃。
  • 通用寄存器存入栈中,记录sp栈指针,读取数据时出栈,从而恢复后得到正确值。

Thinking4.8

  • syscall_env_alloc函数执行过程中可能遇到异常,需要进行异常处理。
  • 此时中断处理还没有完全设置好,当触发缺页中断时,无法进行正确的处理。
  • 子进程在执行时已经复制了父进程中__pgfault_handler的值,所以不需要赋值。

二、实验难点图示

中断,以及系统调用时如何通过特权指令syscall陷入内核态,这一块理解地还不是很透彻。

系统调用的流程:

  1. 调用一个封装好的用户空间的库函数
  2. 调用用户空间的syscall_函数
  3. 调用msyscall,用于陷入内核态
  4. 陷入内核,内核取得信息,执行对应的内核空间的系统调用函数
  5. 执行系统调用,并返回用户态,同时将返回值“传递”回用户态
  6. 从库函数返回,回到用户程序调用处

内核态和用户态的栈空间的管理,进入handle_syscall需要进行相关处理。出现页错误时,内核会把进程在一个新的栈(异常栈)上面重启,运行指定的用户级别页错误处理函数。

  • 设置正确的epc值,从异常处理结束后继续返回到下一条指令。
  • 取出系统调用号
  • 在内核栈上正确存放参数
  • 执行完毕后恢复内核栈指针位置

进程间通信ipc中需要的一些权限位的处理。

写时复制,copy on write机制,先让父子进程共享相同的物理空间,设置异常处理栈和epc值,要处理异常需要将epc的值设置为page_fault_handler,跳转至异常处理函数。

duppage需要区分不同的权限,并且采取对应的处理。

  • 只读页面 按照相同权限(只读)映射给子进程即可
  • 共享页面 即具有PTE_LIBRARY标记的页面,这类页面需要保持共享的可写的状态
  • 写时复制页面 即具有PTE_COW标记的页面,这类页面是上一次的forkduppage的结果
  • 可写页面 需要给父进程和子进程的页表项都加上PTE_COW标记

三、体会与感想

本lab实验总体上内容比较多,系统调用部分需要实现一些重要的函数。首先要理解好系统调用的流程,先从用户空间调用函数,之后由msyscall陷入内核态,在内核态中我们实现了参数和信息的传递,内核态即可执行系统调用函数sys,最终返回到用户空间,再从库函数中返回。

用户空间可以临时执行内核的功能,这是微内核的一种思想,设备驱动、文件系统可以放在用户空间实现,即使它们崩溃,也不会影响到整个系统的稳定。需要实现进程间的通信(ipc)

fork的copy on write机制也有利于提高效率,并不直接复制。而是父子进程中有修改内存的行为发生时,内核捕获这种缺页中断后,再为发生内存修改的进程相应的地址分配物理页面。实现时还需要注意duppage对于不同权限页需要有不同的处理方式。

代码的理解和debug依然存在问题,对于注释中前置条件和后置条件等,对于实现有一定的提示作用。但是自己有些地方还没有理解好,在实现时可能还是有一些细节没有考虑足够,所以在实现时依然存在了bug,花费大量时间才找到。总的来看,收获也很大。

标签:调用,用户,空间,内核,lab4,进程,实验报告,页面
From: https://www.cnblogs.com/ddl789/p/17215437.html

相关文章

  • lab6实验报告
    lab6实验报告一、实验思考题Thinking6.11#include<stdlib.h>2#include<unistd.h>34intfildes[2];5/*bufsizeis100*/6charbuf[100];7intstatus;8......
  • lab5实验报告
    lab5实验报告一、实验思考题Thinking5.1/proc是一种由软件创建的特殊的伪文件系统,通过特殊的接口来访问内核。每一个文件对应于内核中的函数,其中大部分文件时只读的,但可......
  • CS144 LAB0~LAB4
    CS144:LAB00.写在前面这更倾向于个人完成lab后的思考和总结,而不是CS144lab答案或者labdocument翻译(指南或者翻译已经有大佬做的很好了,下面已经贴出链接)出于......
  • python学习-第三方库综合程序设计实验报告
    目录实验四: Python综合程序设计实验名称:Python综合程序设计              指导教师:      实验日期:2022年 12 月 5 日......
  • 实验报告
    一.实验目的解析SSM框架?2.SpringBoot框架功能特性?3.SpringBoot工作生命周期?4.SSM框架和SpringBoot框架的对比?5.Maven框架的jar管理方式? 二.......
  • NEMU PA 4 实验报告
    一、实验目的在前面的PA123中,我们分别实现了基本的运算单元,实现了各种指令和程序的装载,实现了存储器的层次结构。而在PA4中,为了让NEMU可以处理异常情况以及和外设交互,我们......
  • NEMU PA 3-3 实验报告
    一、实验目的在上一章PA3-2中,我们实现了分段机制,将48位的虚拟地址vaddr转换成了laddr。为什么不是paddr呢?这就要说到这一章要完成的东西:**分页机制**。从80386开始,计算......
  • NEMU PA 3-2 实验报告
    一、实验目的在上一章节我们完成了Cache的实现,但是这只是在速度上提高了取指和存取操作数的效率,而在访问的安全性上没有得到有效提升。在PA3-2中我们要完成的,就是在NEMU......
  • NEMU PA 3-1 实验报告
    一、实验目的在前面的PA1中,我们实现了CPU和FPU,在PA2中我们实现了对指令的解码和对ELF的装载,以及进一步完善了CLI调试器。那么在整个PA3中,我们将要着力于内存的相关处理,如C......
  • NEMU PA 1 实验报告
    课程地址:PA1-1https://www.bilibili.com/video/BV1JE411J7AKPA1-2https://www.bilibili.com/video/BV1EE411J7Y6PA1-3https://www.bilibili.com/video/BV1fE411H7nS......