向NachOS添加系统调用

1.     系统调用主要流程

machine的Run函数运行运行户程序,实现在machine/mipssim. cc,基本流程

通过Oneinstruction函数完成指令译码和执行,通过interrupt的OneTick

函数数使时钟前进。。

(1) Oneinstruction函数判断当当前指令是系统调用,转入start. S

(2)通过过start.s确定系统调用入口,通过寄存器r2传递系统调用号,转入

Exception. cc (此时系统调用参数位于相应寄存器)

(3)   exception .cc 通过系统调用识別号识别系统调用,进行相关处理,此处理过程中调用内核系统调用函数(实现在Ksyscall.h),流程结朿时,更新PCReg的值。

(4)    系统调用结束,程序继续执行。

MIPS编译器的参数传递规则如下:

参数1:

r4寄存器

参数2:

r5寄存器

参数3:

r6寄存器

参数4:

r7寄存器

系统调用号/返回参数:

r2寄存器

中断返回跳转到:

r3寄存器

2.     实验主要步骤

由上述流程可以确定实验的步骤如下:

第一步:定义系统调用号和系统调用接口

第二步:添加进入内核系统调用的接口

第三步:在内核中修改中断入口处理函数

第四步:在内核中实现系统调用函数

第五步:编写用户测试程序,修改makefile文件

3.     主要代码分析

(1)Create系统调用

 intCreate(char* filename);

描述:当Create系统调用触发时,在当前test目录下创建一个名为filename的文件

返回值:成功时返回1,失败时返回-1

中断处理简述:(1)通过r4寄存器获得文件名指针base(2)由base读取文件名(3)调用Ksyscall.h中实现的SysCreate函数创建文件(4)根据调用函数的结果,返回相应的值(5)更新PC

其中SysCreate如下:

(2)Open系统调用

int Open(char* filename);

描述:当Open系统调用触发时,在进程中打开名为filename的文件,并返回该文件在进程中的file id,文件只有在被打开后才能读写

返回值:成功时返回文件号file id,失败时返回-1

中断处理简述:(1)通过r4寄存器获得文件名指针base(2)由base读取文件名(3)调用Ksyscall.h中实现的SysOpen函数创建文件(4)根据调用函数的结果,返回相应的值 5)更新PC

 

其中SysOpen如下,文件ID的获取使用了openforreadwrite函数:


(2)Write系统调用

int Write(char* buffer, int size, int id);

描述:当Write系统调用触发时,从内存buffer中向编号为id的文件中写入size个字符

返回值:成功时返回写入的字符数,失败时返回-1

中断处理简述:(1)通过r4寄存器获得指针wbase,r5获得写入内容的wsize,r6获得文件号wfileId(2)由wbase读取要写入的字符串(3)调用Ksyscall.h中实现的SysWrite函数将内容写入文件(4)根据调用函数的结果,返回相应的值 5)更新PC

 

其中SysWrite如下,使用了openfile->Length()和WriteAt相结合,确保每次写入从文件末尾开始写:



(4)Read系统调用

int Read(char *buffer, int size, int id);

描述:当Read系统调用触发时,从编号为id的文件中读取size个字符到内存buffer中

返回值:成功时返回读出的字符数,失败时返回-1

中断处理简述:(1)通过r4寄存器获得指针rbase,r5获得读取长度的rsize,r6获得文件号rfileId(2调用Ksyscall.h中实现的SysRead函数将读取文件内容(3)将读取的字符串写入到以rbase起的地址中去(4)根据调用函数的结果,返回相应的值 5)更新PC

 

其中SysWrite如下:



描述:当Close系统调用触发时,关闭编号为fileid的文件,文件关闭后不能再读写

返回值:成功时返回1,失败时返回-1

中断处理简述:(1)通过r4寄存器获得文件号rfileId(2调用Ksyscall.h中实现的SysClose函数关闭文件(3)根据调用函数的结果,返回相应的值 (4)更新PC

 

其中SysClose如下:



4.     遇到的问题以及解决方法

1)    编译不能通过,查看报错是重复定义变量,例如在不同的case里面重复定义变量base,我原先以为作用域仅限于case中,结果是整个switch

2)    起初测试的时候发现陷入无限循环,经检查,是没有更新PCReg,导致一直执行某条指令而不能前进,增加修改代码即解决

3)    运行测试代码的时候总是出错,后来发现是文件路径有误





猜你喜欢

转载自blog.csdn.net/saber_jk/article/details/80008721
今日推荐