向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

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹