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出有关用户程序的信息。结果如下:
实现乘法和除法的系统调用完成。