给操作系统捋条线

384 阅读6分钟

前言

时隔四个多月,终于把 xv6xv6 这个系列写完了,我把它们整合起来做成了这个 PDFPDF,并命名为 《给操作系统捋条线》。在写第一篇计算机启动的时候,我就说过想要通过 xv6xv6 给操作系统的前前后后,里里外外捋一条线出来,让自己让大家都对操作系统有个清晰的认识。

可能有朋友还不知道 xv6xv6 是个什么东西,都说 mitmit6.8286.828 课程是学习操作系统的神级课程,而 xv6xv6 就是其教学使用的操作系统。xv6xv6 这个系统本身很小,但麻雀虽小五脏俱全,基本的机制它都具备,用它来学习理清操作系统再好不过。从第一篇写到现在私以为把线捋得还是挺清楚的,有一个完整的逻辑闭环。在写之前我就有想过要用一条线一张图把操作系统各个方面给串起来,整个系列写完之后,emmmemmm 发觉有点异想天开了,尝试了很久没成功。

xv6xv6 我分为了五个大的部分:启动,中断,文件系统,进程,控制台,其他部分比如说内存管理,锁等等都是分散在那五大部分里面。每个部分我都尽量细致到各个方面,并且附有详细的文字描述或者流程图

比如说启动流程图

再比如中断流程图

又比如读写文件的流程图

看着这些图感觉还行是吧,较为繁杂的部分基本都有类似的流程图,私以为将 xv6xv6 捋得还是很顺很清楚的。《给操作系统捋条线》主要讲述了下面这些问题,看看你是否清楚:

计算机启动:xv6xv6 的计算机启动过程与常见的一些启动过程稍稍不同,主要是 MBRMBRBootloaderBootloader 揉在一起了,其他的没什么,比较常规,可能就是多处理器的情况可能大家不太熟悉,这一块大概有这么一些问题:

  • BIOSBIOS->MBRMBR->BootloaderBootloader->OSinitOSinit->MultiProcessorMultiProcessor 启动的大概过程?
  • 实模式如何到保护模式?
  • 如何开启分页机制?
  • 逻辑地址,虚拟地址,线性地址,物理地址如何转化的?
  • 如何读取磁盘加载内核?
  • 多处理器的话又是如何启动的?

中断与系统调用:两者的过程差不太多,只不过一个中断源来源于外部,一个来源内部,在内核部分,两者的处理过程基本一样,这一块儿大概有这些问题:

  • 中断与异常的关系?

  • 什么是软件中断? 软件中断和软中断是一个东西吗?

  • 中断控制器 PIC、APIC 的基本认识?

  • 多个处理器多种中断,哪个处理器处理哪个中断呢?

  • 中断的处理过程

    • 向量号,IDT,中断服务程序(如何定位中断服务程序)?
    • 现场的保存与恢复到底什么意思?
    • 发生中断期间栈是如何变化的?
  • 系统调用大致过程?

  • 系统调用时用户程序的参数如何传递给内核?

文件系统:xv6xv6 将文件系统分为了 7 层,磁盘缓存日志inode目录路径文件描述符磁盘 \rightarrow 缓存 \rightarrow 日志 \rightarrow inode \rightarrow目录 \rightarrow 路径 \rightarrow 文件描述符,大概有这些问题:

  • 磁盘驱动程序(磁盘如何读写)?
  • 一个简单的日志系统如何设计?
  • 为什么日志系统能够保证数据的一致性?
  • inodeinode,文件,目录,目录项,文件描述符,文件结构体它们之间到底什么关系?
  • 一切皆文件怎么理解,为什么 writewritereadread 这两个系统调用就可以读写任意类型的文件?
  • 目录项,硬链接,软链接到底什么意思,有什么关系?
  • 常见的文件系统调用比如 dupdup 如何实现的?

进程

  • 如何创建一个进程(forkfork 实现)?
  • 第一个进程如何创建的?
  • 程序是如何从磁盘加载到内存的(execexec 实现)?
  • 一个进程如何被调度上 CPUCPU
  • 常见的调度算法及其利弊?
  • 进程如何切换(页表,TSSTSS,栈,上下文等是如何变化的)?
  • 进程的休眠唤醒如何实现?
  • 进程的等待退出如何实现?
  • 孤儿进程,僵尸进程什么意思?
  • 程序从 mainmain 开始执行(简单了解了解运行库)?
  • 堆到底是个什么玩意儿?如何实现?如何组织管理?

内存管理:

  • xv6xv6 的物理内存是如何管理的,虚拟内存又是如何管理的?
  • 虚拟地址空间应该如何理解?
  • 地址 0 真的就不能访问?
  • 所谓的分配内存做了些什么事

锁:

  • 自旋锁如何设计?
  • 休眠锁如何设计?
  • 常见死锁判断

控制台:

  • 键盘的简单认识
  • 显卡的简单认识
  • 串口的简单认识
  • 按下一个键到输出到屏幕这之间的详细过程?
  • printfprintf 函数如何实现的
  • 为什么文件描述符 0、1、2 就表示标准输入输出错误呢?
  • shellshell 如何实现的
  • 重定向什么意思,如何实现?
  • 管道什么意思,如何实现?
  • 一些常用命令如 echoechogrepgrep 等等如何实现的?

大概就这些吧,把这些问题捋清楚,那么对于操作系统的认识应该比较清楚了。

xv6xv6 其实有自己的文档,我反复看过几遍,觉得其实不太适合上手阅读,xv6xv6 的文档只是讲述了一些重要部分,这不可避免的知识点分散。而我写的 xv6xv6 系列文章大概涵盖了 90%90\% 的代码,重要部分,细节部分基本上完全覆盖,是真正地形成了一个完整详尽的逻辑闭环。

另外我也向诸位坦白地讲,本人的水平不高,其中的一些复杂机制我也不是太懂,比如说硬件部分,比如说锁的问题,再者有些机制为什么要这么设计,有什么好处,不这样设计行不行等等问题。关于 xv6xv6 若略过一些细节只了解操作系统如何运作的,这件事还是很简单的,可一旦深入细节,多问自己几个为什么,一些看似简单的问题都可能变得很复杂,这似乎是自找麻烦,但学习不就是这样的吗?

关于代码我上传了一份有“详尽”注释的版本,配合着本资料,看起来应该容易些,里面也还有各种手册资料,本资料也在里面,有需要的可以下载,在我公号后台回复 xv6 即可获取

对于《给操作系统捋条线》有什么问题还请批评指正,也欢迎大家来同我探讨学习交流,将其不断完善。最后,emmmemmm ......,这份资料确是我这几个月的心血,夜夜咖啡伴,头发根根掉,身体滑千丈,捋出一条线,若对大家却有帮助,还望关个注,在此拜谢。