操作系统接口 – 阅读 xv6-riscv-book

Xv6的时钟周期:定时器芯片两次中断之间的时间

xv6作为一个简单的操作系统,利用一个“内核kernel”向其他运行中的程序提供服务的特殊程序,这个内核相当于连接了硬件和运行程序。

每一个正在运行的程序可以称为进程,都拥有子集的包含指令、数据、栈的内存空间。

指令实现程序的运算,数据是用于运算过程的变量,栈则管理程序的过程调用

内核对于一台计算机来说是唯一的。

进程会通过system call指令来调用一个内核服务。本质上是对操作系统上的接口调用。系统调用会进入内核,让内核执行服务然后返回。所以进程会在用户控件(软件层)和内核空间(操作系统层)交替运行。

System call指令由kernel提供。

内核会为每个进程关联一个PID。

进程和内存

如何创建一个进程

使用system call指令fork可以创建一个子进程。其内存内容与调用的进程完全相同,原进程称为父进程。

父进程中 fork返回子进程的PID

子进程中 fork返回0

创建一个简单的程序

在user文件夹下创建c文件,然后再Makefile文件中,UPROGS添加程序名称,然后直接在qemu中调用即可。

比如书中的fork程序



修改Makefile文件



在qemu中调用

exec系统调用指令

使用从文件系统中存储的文件所加载的新内存映像替换调用进程的内存,操作系统会从第一个参数的文件中加载指令到当前进程中,并且替换当前进程的内存。然后开始执行这些新加载的指令

exec有两个参数:可执行的文件名和字符串参数数组

#include "kernel/types.h"
#include "user/user.h" int main()
{
//system call exe
//echo
char* argv[] = {"echo","this","is","echo",0};
exec("echo",argv);
printf("exec error\n");
exit(0);
}

使用fork或者exec等系统调用指令,xv6系统都会分配内存。

fork依靠父进程创建子进程,需要分配足够拷贝父进程内存空间的内存

exec是切换进程,需要分配足够的内存空间供新进程使用。

I/O和文件描述符

文件描述符用于表示进程可以读取或写入的由内核管理的对象。

文件描述符所指的对象称为“文件”。通过文件描述符提供的接口可以将文件、管道和设备之间的差异抽象出来。

xv6内核使用文件描述符作为每个进程表的索引,每个进程都有一个从零开始的文件描述空间。

一个进程会从文件描述符0开始读取。将输出写入文件描述符1,将错误消息写入文件描述符2。

read 和 write system_call

  1. read

    read(fd,buf,n) 该system_call指令表明从文件描述符fd读取最多n字节,然后复制到buf中。文件的每个文件描述符都有一个与之关联的偏移量。每次read读取都是从当前文件偏移量开始读取数据,然后移动偏移量。没有字节可供读取会返回0
  2. write

    write(fd,buf,n) 将buf中的n字节写入文件描述符中,并返回写入的字节数,如果发生错误会写入小于n字节的数据,同样会存在一个文件偏移量

close system_call

用于释放一个文件描述符。新分配的文件描述符总是当前进程中编号最小的未使用描述符

I/O重定向

文件描述符和fork相互作用。

fork()会复制父进程的文件描述符表及其内存,使得子进程会具有和父进程完全相同的打开文件。

exec()会替换当前进程的内存,但会保留其文件描述符表。

所以当我们fork()后,可以在子进程中重新打开文件描述符,然后使用exec()来运行新程序。子进程修改的文件描述符不会影响到父进程。

这就是fork()和exec()两个sys_call相互分离的好处,在fork()后可以对子进程操作文件描述符而不会影响父进程。

但文件偏移量确实唯一的,即子进程修改了文件,那么偏移量发生了改变,父进程中的偏移量同样发生了改变。

dup sys_call

dup()接受一个文件描述符的参数,会返回这个文件描述符的引用,它们属于同一个I/O底层。这个实参和dup返回值共用一个文件偏移量。

管道

管道的两端一端用于写入,一端用于读取。为进程提供了一种通信方式。

管道具有阻塞机制,即管道的read会在没有输入时一直等待。

文件系统

Book-Riscv-XV6-Chap1的更多相关文章

  1. MIT6.828准备:MacOS下搭建xv6和risc-v环境

    本文介绍在MacOS下搭建Mit6.828/6.S081 fall2019实验环境的详细过程,包括riscv工具链.qemu和xv6,对于Linux系统同样可以参考. 介绍 只有了解底层原理才能写好上 ...

  2. MIT 6.S081 xv6调试不完全指北

    前言 今晚在实验室摸鱼做6.S081的Lab3 Allocator,并立下flag,改掉一个bug就拍死一只在身边飞的蚊子.在击杀8只蚊子拿到Legendary后仍然没能通过usertest,人已原地 ...

  3. XV6学习(8)中断和设备驱动

    驱动是操作系统中用于管理特定设备的代码:驱动控制设备硬件,通知硬件执行操作,处理中断,与等待该设备IO的进程进行交互. 当设备需要与操作系统进行交互时,就会产生中断(陷阱的一种),之后内核的陷阱处理代 ...

  4. XV6学习(10)锁

    在包括XV6的绝大部分操作系统都是多个任务交错执行的.交错的一个原因是多核硬件:多核计算机的多个CPU核心独立执行计算,如XV6的RISC-V处理器.多个CPU核心共享物理内存,XV6利用这种共享来维 ...

  5. xv6的作业翻译——作业1 - shell和系统调用

    Xv6的lecture LEC 1 Operating systems   L1: O/S overview L1:O/S概述   * 6.828 goals 6.828的目标   Understan ...

  6. xv6课本翻译之——第0章 操作系统接口

    Chapter 0 第0章 Operating system interfaces 操作系统接口 The job of an operating system is to share a comput ...

  7. xv6课本翻译之——附录A Pc的硬件

    Appendix A 附录A PC hardware Pc的硬件 This appendix describes personal computer (PC) hardware, the platfo ...

  8. xv6的课本翻译之——附录B 系统启动器

    Appendix B 附录 B Figure B-1 The relationship between logical, linear, and physical addresses. 图B-1:逻辑 ...

  9. ubuntu编译运行xv6

    最近想找个简单的类Unix系统学习下, xv6不错的, 所有代码加起来不到一万行,首先把代码跑起来还是很重要的. # 下载xv6源码并编译 git clone git://pdos.csail.mit ...

  10. xv6实验环境搭建

    安装bochs 因为要运行的是xv6,所以不能直接使用 apt-get 直接获取软件.apt-get获取到的软件不支持SMP (Symmetric Multi-Processing).因此,需要下载源 ...

随机推荐

  1. Vuepress + GitHub Actions实现文档博客自动部署

    说明 接着我上一篇文章,已经使用vuepress+github pages搭建好了自己的文档博客,并且可以在本地打包上传后就可以在pages上查看更新内容.但是有1个比较明显的缺点:打包速度并不快!! ...

  2. 《系列一》-- 2、XmlBeanFactory 的类图介绍.md

    阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内容需要看官自己去源码中验证.全系列文章基于 spring 源码 5.x 版本. Spring源码阅读系列--全局目录.md ...

  3. 原来你是这样的JAVA--[07]聊聊Integer和BigDecimal

    今天来聊聊Java中跟数值处理相关的两个类型Integer和BigDecimal. 说起这两个类型,我们肯定都不陌生,但是其中有些容易踩到的坑需要注意避让. Integer 整型我们应该每天都会用到, ...

  4. 项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936各位读者,知识无穷而人力有穷,要 ...

  5. 图书管理系统---基于form组件和modelform改造添加和编辑

    添加 基于form组件改造 步骤1 1.为了区分自己写的form类和视图逻辑,所以工作中需要区分开来,那么就可以在应用下创建一个叫utils的文件夹,专门存放我们写的form类,py文件名随便起 2. ...

  6. chrony同步时间

    chrony文件组成 包:chrony 两个主要程序:chronyd和chronyc - chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务同步.它确定计算机增减时间的比率,并 ...

  7. 问题解决:由于找不到msvcr110.dll,无法继续执行代码

    报错 解决 下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=30679

  8. Cocos Creator 2.x升级至Cocos Creator 3.x

    1.导入类时,批量导入 2.导入 override...关键字时,批量导入 3.this.node.scale = 0.6-->this.node.setScale(0.6, 0.6); 4.n ...

  9. 使用go语言开发自动化API测试工具

    前言 上一篇文章说到我还开发了一个独立的自动测试工具,可以根据 OpenAPI 的文档来测试,并且在测试完成后输出测试报告,报告内容包括每个接口是否测试通过和响应时间等. 这个工具我使用了 go 语言 ...

  10. 2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di

    2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同.实现一个叫「餐盘」的类 DinnerPlates, Di ...