OS

Nachos系统调用实现

Posted by Starrk的小屋 on July 2, 2019

Nachos系统调用

Nachos 只有一些系统调用,同时诸如 exec 、join等系统调用还不完全,需要用户自己去编写。本文目标是编写一个新的系统调用,参照加法的系统调用编写出乘法和除法的系统调用。

新的系统调用的实现

test目录下的修改

进入 code/test目录,编写一个C程序,模仿add.c,命名为test.c 样例如下:

这是等会进行编译测试的程序,Mul和Div是我们将要追加的系统调用。此外还需要在test目录下更改start.c,它是编译程序时的入口,再执行可执行文件时会通过start.o进行查找系统调用,所以需要在start.c 中追加新的系统调用,格式参考add。

最后还需要修改Makefile,使得能对用户程序进行编译生成可执行文件,在SOURCES后追加就完事了,偷懒可以直接在halt.c里面编写,最后执行halt.c就行了。

userprog 目录下的修改

首先需要修改syscall.h ,添加系统调用号以及声明系统调用

此外还需要修改exception.cc,它是用来处理中断的,异常和系统调用都算中断,它的作用是告诉系统遇到中断后该如何去做,同样仿照case SC_ADD 进行编写。

最后在ksyscall.h 中定义系统调用的参数以及如何去做:

编译和测试

编译

进入code/build.linux 目录,在Makefile文件中添加32位编译环境

重新编译Nachos系统,清除之前的编译并重新编译

make clean && make

进入 code/test 目录,编译 make 之后 ls 查看,成功会生成 test.noff 可执行程序。如若这里报错,可以回溯上文的操作步骤是否已正确达成,或者确认交叉编译器是否成功安装并更改成正确的编译环境。

测试

在 test 目录下 执行

../build.linux/nachos -x test.noff -d u

-d u 参数是debug出有关用户程序的信息。结果如下:

实现乘法和除法的系统调用完成。