深大操作系统:xv6 综合实验二:有名管道,内存交换,文件权限,线程

前言

这是本学期最后一个实验,不出意外的话,也是我在深大做的最后一个实验,也是【深大 xxxx 实验】系列的最后一篇博文了。常言道善始善终,希望这个实验能给我的作业生涯一个好的收尾

收个寄吧收,你要是看了接下来的代码就会发现,我根本就是在摆烂,代码一点都不严谨,突出一个能动就行

诚然我们班的实验非常难,但是坚持下来,我真的感觉学到了东西。当然,来自 mit 的 xv6 功不可没,不得不承认 xv6 是一个优秀的教学操作系统,虽然大部分时间我都在痛骂它的编写者并且尝试杀死它的妈妈

试过方知道,开发一个操作系统是由多么艰难,以后再也不黑华为了,我错了,鸿蒙 nb

咳咳。。

1. 线程

1) 修改xv6内核代码实现简单线程;(40%)

采用和 linux 类似,用 proc 结构体同时代表进程和线程,统一地进行调度。但是和进程不同,线程不具有自己的地址空间,线程共享父进程的地址空间,此外线程还要拥有自己的栈指针以和父进程的执行流分开。

在 proc.h 中的 proc 结构体中,添加两个字段,分别是父线程的 pcb 指针,和进程的用户栈指针:

在这里插入图片描述
然后在 proc.c 中编写 colne 函数。和 fork 不同,clone 函数接收一个 预先分配 的用户空间的 虚拟地址 作为用户栈,同时将父进程复制一份,不过子线程共享了父进程的进程页表,此外 colne 还要修改子线程的内核栈,将中断的返回地地址覆写为线程要执行的函数 func,同时将 func 的参数和返回地址压入用户栈中:

在这里插入图片描述
在这里插入图片描述
然后是 proc.c 中的 join 函数,它遍历页表并且找到指定 tid 的线程(事实上是 pcb 的 pid 属性)然后查看其状态,如果是 zombie,说明子线程已经调用 exit 并且结束,这时候只需要回收其资源就行了。如果子线程尚未结束,那么父进程需要阻塞:

在这里插入图片描述
在 defs.h 中加入两个函数的声明,以便 sysproc.c 能够使用:

在这里插入图片描述
在 sysproc.c 中实现两个内核态的函数的调用:

在这里插入图片描述
然后在 syscall.h 中添加对应的系统调用号

在这里插入图片描述
然后在 syscall.c 中添加对应的 extern 函数,同时在中断向量表中加入两个元素:

在这里插入图片描述
在这里插入图片描述
然后在 user.h 中添加用户态的入口:

在这里插入图片描述
最后修改 usys.S,添加:

在这里插入图片描述
在 Makefile 中添加:

在这里插入图片描述
然后编写用户态的测试代码 thread_test.c 文件,首先创建 3 个线程,通过参数传入他们的编号,然后分别输出 5 次,同时调用递归函数,打印共享变量,这里加了个 while 手动延时,以方便让输出一行一行的比较整齐:
在这里插入图片描述
在这里插入图片描述
进入 xv6,运行测试程序:
在这里插入图片描述
三个线程,增加全局变量共 15 次,正确,而递归函数的调用也正确,全局变量的增加顺序也表明了线程之间是相互并发的执行的,比如线程 2 读取到全局变量为 8,但是下一次就变成 12 了,并不是线性增加,说明有其他程序也在并行

2. 文件权限

2) 修改xv6内核代码实现文件访问权限控制;(30%)

一个文件对应一个 inode,文件的访问控制信息可以存储在 inode 中。而在 linux 中,一个 inode 的大小通常是定死的 256 或者 512 字节,不能够轻易改动,于是只能拆一部分数据出来。

磁盘的 inode 结构体定义在 fs.h 中,修改 fs.h,将 type 的 short 类型的 16 bit 拆成两个 8bit 的 char 类型,其中 mode 用来存储文件的访问控制权限,而 type 则做原来的用途,表示文件的类型:

在这里插入图片描述
在磁盘中的布局改变了,同理在内存中的布局和访问方式,也要相应地改写,从磁盘读取 inode 数据并且转换为 stat 结构体。改变 stat 结构体的布局,使其适应新 inode 结构:

在这里插入图片描述
同理,file.h 中的 inode 结构体的定义也要稍作修改:

在这里插入图片描述
同时修改 mkfs.c 中的 ia

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值