本文主要是介绍向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) 运行测试代码的时候总是出错,后来发现是文件路径有误
这篇关于向NachOS添加系统调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!