xv6: a simple, Unix-like teaching operating system(第一章)

122 阅读3分钟

前言

本书介绍XV6,教学类型的Unix系统,原文链接 pdos.csail.mit.edu/6.S081/2022…

让我们进入第一章,首先看看目录

image.png 操作系统接口,第一章主要告诉读者操作系统有哪些接口

  1. 进程和内存
  2. I/O和文件描述符
  3. 管道
  4. 文件系统
  5. 真实世界(啥玩意?没懂)
  6. 练习

除了第5个不知道啥东西,其余的都还听过这些名词

前言主要看这张图

image.png 大致就是说,操作系统管理和抽象底层硬件,内核提供接口给用户,用户发起系统调用,硬件会执行内核预制的函数

1. 进程和内存

简单的介绍了一下进程:

An xv6 process consists of user-space memory (instructions, data, and stack) and per-process state private to the kernel.

xv6进程由用户空间内存(指令、数据和堆栈)和内核私有的每个进程状态组成。

Xv6 time-shares processes: it transparently switches the available CPUs among the set of processes waiting to execute. When a process is not executing, xv6 saves the process’s CPU registers, restoring them when it next runs the process. The kernel associates a process identifier, or PID, with each process.

Xv6分时进程:它透明地在一组等待执行的进程之间切换可用的cpu。当进程未执行时,xv6保存该进程的CPU寄存器,并在下次运行该进程时恢复它们。内核将进程标识符或PID与每个进程相关联。

又介绍了一下xv6有哪些系统调用,如图

image.png

重点介绍了一下fork系统调用

代码如下

image.png

输出如下

image.png

可以看出fork()函数调用之后,父子进程都会走这段代码,然后父进程会走pid > 0的分支,子进程会进入pid == 0的分支,父进程会被wait()函数阻塞,等子进程走完之后,wait()走完,父进程也走完

2. I/O和文件描述符

文件描述符是一个非负整数,表示进程可以从中写入或读取,进程可以通过打开文件、目录或设备来获得文件描述符,或者通过创建管道或者通过复制现有描述符。

下面是有关IO的系统调用例子

这个应该是还是比较好懂的,从文件描述符0中读文件写入文件描述符1中,代码如下

image.png

一个比较重要的例子,fork和dup都会共享文件描述符,最终在文件描述符1中,内容都是hello world

image.png

image.png

3. 管道

管道是一个小的内核缓冲区,作为一对文件描述符暴露给进程,一个用于读一个用于写

例子:

image.png

上面的例子,首先系统调用pipe,创建管道。

子进程关闭刚才打开管道的文件描述符0,dup函数,复制管道读的方向p[0],此时返回的文件描述符是0,再关闭p[0],p[1],在执行wc 0,即从管道读的方向读数据,由于管道中没数据,所以会阻塞

父进程关闭p[0],向p[1]写入hello world,再关闭p[1],父进程退出

子进程发现p中有数据写入,开始读取,之后又发现管道关闭,子进程从而退出

4. 文件系统

chdir

改变当前进程的目录,比如下面1-3行代码 = 第4行代码

image.png

mkdir,open, mknod

mkdir创建目录dir, open+O_CREATE创建文件file,mknod创建一个文件指向设备

image.png

fstat

展示文件的stat信息

image.png

link, unlink

最底层的文件叫做inode

创建/移除一个链接,当inode的连接为0,将会删除

5. 现实世界

说了一堆有的没的,忽略