操作系统实验记录
|Last edited: 2024-12-27
本报告记录了2024年秋季学习操作系统课程的内核赛开发记录,由于本文档并没有与开发过程同步编写,故部分内容只能通过仓库的commit记录进行回忆,可能不够准确。
 

一、环境配置

对于刚刚选修操作系统,对于文件系统的认识仅限于ICS中的文件描述符的同学来说,修改拉取下来的xv6-k210源码使其能够在平台上正常运行是难度相当大的一步。
在教学网中提供的教程之外,我们还需要进行修改:
在make的all目标下,添加如下指令:
同时添加关机指令:
通过xv6-k210自带的doc说明文档,我们可以找到添加系统调用的方式,在此处不进行赘述,而具体的shutdown系统调用的实现则更为简单,
即可。
这样,我们把代码提交到希冀平台上,就能取得0分的好成绩了。
 

二、系统调用实现

下面的具体实现说明顺序是按照官方测试样例中的顺序进行说明的

sys_getcwd 17

该系统调用需要返回进程的工作目录,通过对xv6-k210代码的阅读,发现proc结构体中保存了进程的当前工作目录的目录项,直接使用即可。
具体代码实现中做的只是不断递归向上查找,查找到根目录位置,并对要返回的字符串进行一些处理
 

sys_pipe2 59

该系统调用具体功能与xv6-k210实现一致,修改系统调用号即可
 

sys_dup 23

同上
 

sys_dup3 24

该系统调用实现与dup类似,手动设置proc结构体中的ofile(即打开文件表)中对应的fd为该文件即可。
 

sys_chdir 49

修改系统调用号即可
 

sys_openat 56

我们需要在xv6-k210的基础上,修改O_CREATE和测试用例的定义保持一致 ,并在头文件中添加O_DIRECTORY用于判断文件是否是目录文件,具体实现逻辑与xv6-k210区别不大
 

sys_close 57

修改系统调用号即可
 

sys_getdents 61

测试中要求的目录项结构体与xv6-k210中不同,我并没有大刀阔斧修改xv6-k210,而只是返回了符合测试样例的结构体而已。思路是通过fd找到对应目录文件并读取目录项,并把相关信息赋值给要求的结构体即可。
 

sys_read 63

修改系统调用号即可
 

sys_write 64

修改系统调用号即可
 

sys_unlinkat 35

思路是通过调用xv6-k210中自带的eremove()函数执行unlink。
 

sys_mkdirat 34

修改系统调用号即可
 

sys_fstat 80

由于xv6-k210使用的为FAT32文件系统,测试用例中要求返回的结构体的部分字段并不适用于FAT32,于是我们只填写能够填写的字段,具体通过xv6-k210中的estat函数获取。
 

sys_clone 220

通过阅读testsuits中对clone的实现,我们可以知道参数和对应寄存器的位置,思路是在fork()的基础上,按照对应寄存器和参数的关系设置对应值即可。
 

sys_wait4 260

可以借助xv6-k210自带的wait()实现,在原有代码基础上增加可以等待具体pid的子进程结束的条件即可。
 

sys_exit 93

修改系统调用号即可
 

sys_getpid 172

修改系统调用号即可
 

sys_getppid 173

思路是通过myproc()获取当前进程的PCB,并从中获取parent的PCB指针,再获取对应pid即可。
 

sys_brk 214

通过调用xv6-k210自带的sbrk函数即可,功能是类似的。
 

sys_times 153

xv6-k210提供的关于时间的调用接口比较有限,难以统计所需信息,我们只是简单地通过tick()来计算时间。
这里我们观察到qemu平台的频率是10000000Hz,因而我们需要修改xv6-k210中的INTERVAL设定(只是修改分子分母),要注意保持原计算数值不变或相近,否则会导致yield()出现问题(调度间隔太小),这样我们的tick就有了物理意义,方便之后的系统调用实现。
 

sys_uname 160

打印系统信息即可
 

sys_sched_yield 124

调用xv6-k210中自带的yield即可
 

sys_gettimeofday 169

在之前的修改中,我们现在的tick已经有了物理意义,通过tick计算时间即可
 

sys_nanosleep 101

同样是每次唤醒时通过tick判断时间,如果时间到了则醒来
 

sys_mount sys_umount

暂时return0即可。
 

sys_mmap sys_munmap

思路是在进程的PCB中新建一个管理mmap区域的结构体,原本想从trapframe向下增长,但是实现过程中遇到了一些问题,于是与xv6-k210中一样,从堆向上增长,维护每个mmap的长度和区域,使用内置的uvmalloc和uvmdealloc函数即可实现
 
 
Loading...