提示:看到的学弟学妹们不要想着copy哈,认真琢磨操作系统是一件非常有意思的事!

目录

  • 实验题目
  • 一、实验目的、环境
  • 二、实验步骤
  • 总结
    • 1.Nachos是什么?
    • 2.预备知识
    • 3.文件结构分析
    • 4.nachos用户程序运行流程
    • 4. ExceptionHandler()分析
  • 后记

实验题目


提示:以下是本篇文章正文内容,下面步骤仅供参考

一、实验目的、环境

二、实验步骤

  1. 在/userprog/syscall.h中进行宏定义和函数声明

  1. 在/userprog/ksyscall.h中实现函数的功能

  2. 在mipssim.cc可看到nachos执行系统调用的方法是升起异常——调用中断处理函数。

因此下一步是在/userprog/exception.cc中通过switch实现对不同指令的响应功能,以及对异常进行处理。

此处仅以mul实例

  1. 在/test/start.s中补充汇编指令代码,实现系统调用
    我们可以观察到Add函数的实现是将系统调用类型(type)SC_Add放入了2号寄存器中,然后执行syscall。因此直接模仿改写。

5.在test文件夹下增加test.c,实现函数调用

  1. 修改makefile 使得test.c正确编译

  2. 在/test路径下清除先前的编译结果,再make编译

  3. 在/build.linux路径下make进行全局编译并运行


总结

1.Nachos是什么?

Nachos (Not Another Completely Heuristic Operating System),是一个教学用操作系统,提供了操作系统框架:

  1. 线程
  2. 中断
  3. 虚拟内存(位图管理所有物理页,虚拟地址与物理地址之间的转换等)
  4. 同步与互斥机制(锁、条件变量、信号量),读者写者问题,生产者消费者问题,BARRIER问题等
  5. 线程调度(基于优先级可抢占式调度,时间片轮转算法,FIFO调度)
  6. 文件系统
  7. 系统调用
  8. 机器指令、汇编指令、寄存器
    ……
    Nachos模拟了一个MIPS模拟器,运行用户程序。

2.预备知识


addiu $2 $0 SC_Write 即0号寄存器的值与SC_Write的调用号相加并存入2号寄存器,其中0号寄存器的值恒为0.

系统传递参数>4:x64汇编传递超过4个参数
返回值非整数:可采用指向返回字符串/结构体的指针。

3.文件结构分析

code/userprog/syscall.h:这里定义了Nachos中的系统调用号,以及相应的系统调用接口。Nachos目前共有11种系统调用。

code/userprog/exception.cc:这里定义了异常处理函数。当异常发生的时候,ExceptionHandler函数会被调用。系统调用也是异常的一种,即SyscallException。然后根据从寄存器中读到的系统调用号,来进行相应的处理。
code/test/start.s:用于辅助Nachos中用户程序的执行。该文件共有两个作用,其一是定义程序执行时跳转到main函数,以及程序执行结束时调用Exit系统调用。另一个作用是,实现了用户程序的系统调用接口,该接口会将参数放在寄存器中,并跳转到异常处理函数执行相应的处理。

4.nachos用户程序运行流程


4. ExceptionHandler()分析

//mul
case SC_Mul://终端输出信息DEBUG(dbgSys, "Mul " << kernel->machine->ReadRegister(4) << " * " << kernel->machine->ReadRegister(5) << "\n");/* Process SysMul Systemcall*/int resultMul;resultMul = SysMul(/* int op1 */(int)kernel->machine->ReadRegister(4),/* int op2 */(int)kernel->machine->ReadRegister(5));DEBUG(dbgSys, "Mul returning with " << resultMul << "\n");/* Prepare Result *///从2号寄存器中取值kernel->machine->WriteRegister(2, (int)resultMul);/* Modify return point */ //即PC+1{/* set previous programm counter (debugging only)*/kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg));/* set programm counter to next instruction (all Instructions are 4 byte wide)*/kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);/* set next programm counter for brach execution *///注意此时的PC以变成之前的NextPCkernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4);}return;ASSERTNOTREACHED();break;

后记


第一次认真写博客,希望能坚持。

操作系统试验-Nachos系统调用实现相关推荐

  1. Linux C: 文件操作相关的系统调用

    一.常见的文件操作相关的系统调用 普通权限的系统调用 函数 说明 int access(char *pathname,int mode) 检查对某个文件的权限 int chdir(const char ...

  2. Nachos系统调用的实现

    实验目的 模仿code/test/add.c,阅读并理解其实现过程,实现求乘法,除法两种系统调用. 了解并掌握Linux下nachos的系统调用 实验内容 在/userprog/syscall.h中进 ...

  3. fork与操作文件的系统调用问题

    1.打开文件 int open(const char* pathname, int flags)//用于打开一个已存在的文件 int open( const char* * pathname, int ...

  4. 【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...

  5. 【Linux】文件操作系统调用

    一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的 ...

  6. Nachos之系统调用

    今天仔细研究了Nachos的系统调用(主要阅读Nachos Study Book.pdf),基本上理解了Nachos系统调用的过程. 首先来明确一下系统调用的概念,系统调用是指用户程序调用系统提供的程 ...

  7. 浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)

    首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完 ...

  8. Linux系统调用FAQ

    1. Linux系统调用的作用? 系统调用是操作系统为用户态运行的进程与系统内核.硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口,在应用程序和硬件之间设置一个额外层的优点包括: 1.    ...

  9. linux系统调用理解之摘录(2)

    原文博客 http://blog.csdn.net/gatieme/article/details/50779184 Linux系统调用的实现机制分析 本文介绍了系统调用的一些细节. 首先,分析了系统 ...

  10. 操作系统课设--系统调用

    山东大学操作系统课设lab6 实验六 系统调用(lab6) 实验目的 实验环境 实验思路 调试记录 实验六 系统调用(lab6) 实验目的 扩展现有的class AddrSpace的实现,使得Nach ...

最新文章

  1. 重磅!IJCAI 2020 好狠,超四成论文未经全文评审就out!被拒作者:一脸懵逼,反馈意见呢?...
  2. 10.27T2 线性DP+拆分
  3. Permutation Partitions CodeForces - 1326C(组合数学+思维)
  4. 实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 2
  5. 中resource文件夹的作用_冲突与碰撞:OpenStack中的虚拟机和裸机
  6. Linux shell 字符串匹配
  7. 计算机网络---ICMP、IGMP协议
  8. Windows XP 下安装Perl cpan模块
  9. java 打印日志乱码
  10. spss下载以及安装详细教程
  11. 借助Bodymovin播放svg动画
  12. JS API Sample_Query Attachments 查询附件
  13. 开发微信小程序中遇见的难点,以及解决方法
  14. linux下gzip用法,Linux gzip 命令的使用
  15. 不良事件总结怎么写_年度不良事件总结
  16. MySQL中表的增删查改操作(CRUD)
  17. 平板电脑出现计算机错误,苹果平板电脑显示iPad已停用连接iTunes怎么办
  18. 基于java+mysql的Swing+MySQL图书管理系统(java+swing+gui+mysql)
  19. NYOJ-1273-宣传墙
  20. PHP常用的文件操作函数集锦

热门文章

  1. APP开发策划方案怎么写?
  2. 叙述计算机的主要应用领域并各举实例说明,大学计算机基础练习习题集.doc
  3. C++ primer 练习题
  4. CSS安全字体的写法
  5. Foobar2000的配置及优化
  6. 玩转C语言Socket网络编程
  7. 苹果无线笔记本怎么连不上win服务器,苹果笔记本连不上无线_苹果笔记本连不上wifi...
  8. 从零开始学androidandroid开发环境的搭建.一.
  9. 万年历代码java功能_java 的万年历代码
  10. NUC980开源项目9-官方Kernel编译