向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调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.