前言
本书介绍XV6,教学类型的Unix系统,原文链接 pdos.csail.mit.edu/6.S081/2022…
让我们进入第一章,首先看看目录
操作系统接口,第一章主要告诉读者操作系统有哪些接口
- 进程和内存
- I/O和文件描述符
- 管道
- 文件系统
- 真实世界(啥玩意?没懂)
- 练习
除了第5个不知道啥东西,其余的都还听过这些名词
前言主要看这张图
大致就是说,操作系统管理和抽象底层硬件,内核提供接口给用户,用户发起系统调用,硬件会执行内核预制的函数
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有哪些系统调用,如图
重点介绍了一下fork系统调用
代码如下
输出如下
可以看出fork()函数调用之后,父子进程都会走这段代码,然后父进程会走pid > 0的分支,子进程会进入pid == 0的分支,父进程会被wait()函数阻塞,等子进程走完之后,wait()走完,父进程也走完
2. I/O和文件描述符
文件描述符是一个非负整数,表示进程可以从中写入或读取,进程可以通过打开文件、目录或设备来获得文件描述符,或者通过创建管道或者通过复制现有描述符。
下面是有关IO的系统调用例子
这个应该是还是比较好懂的,从文件描述符0中读文件写入文件描述符1中,代码如下
一个比较重要的例子,fork和dup都会共享文件描述符,最终在文件描述符1中,内容都是hello world
3. 管道
管道是一个小的内核缓冲区,作为一对文件描述符暴露给进程,一个用于读一个用于写
例子:
上面的例子,首先系统调用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行代码
mkdir,open, mknod
mkdir创建目录dir, open+O_CREATE创建文件file,mknod创建一个文件指向设备
fstat
展示文件的stat信息
link, unlink
最底层的文件叫做inode
创建/移除一个链接,当inode的连接为0,将会删除
5. 现实世界
说了一堆有的没的,忽略