向NachOS添加系统调用

2023-10-24 18:58
文章标签 系统 调用 nachos

本文主要是介绍向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添加系统调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277128

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音