操作系统实验记录
本报告记录了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函数即可实现