操作系统笔记

前置课程:计算机组成原理,汇编语言

笔记概要:记录哈工大的os课程,这门课把os的骨架基本都讲清楚了,但不可能讲清楚细节,其他课程我也看了,有点照本宣科的感觉,包括清华那个,讲的太枯燥无味了,像是念课本。蒋炎岩那个也不错,不过不适合入门。最佳的入门方式就是先把硬件和汇编学学,不用学多深,然后学os,当然,中间这个过程你会觉得好像还是很多搞不懂,这是因为os这门课涉及的东西确实太多,学完全部后,回过头来多学几次,才能慢慢摸清楚怎么回事,试图第一次听懂基本不可能的。并且,没有一门课给你面面俱到的,因此,即便有哈工大os这么好的课程,也还是需要多查,补充课程中的细节的地方,这门课的核心是os骨架!

内存布局

概要

首先声明本笔记不是教程,而是对应课程的笔记,看完课程有个概念后,然后肯定存在一些想要摸清楚但是课程里面却没讲的细节,这里第一个需要讲清楚的细节就是经过bootsect.s和setup.s和head.s后,物理内存的布局是什么样的,关键的数据结构在内存中的哪个位置。这个对于后面程序的理解较为重要。比如GDT表,前4项是操作系统寻址的段描述符,后面的项是进程的tss和ldt表地址,由TR寄存器和LDTR寄存器指向,相关的硬件指令(ljmp和mmu寻址)工作时会用到。

此外,由于内存管理就是维护一个mem_map,用于分配物理内存的数据结构,这个东西比较简单,就没画出来。

然后,进程就是一个PCB,里面核心的两个东西就是tss和ldt,一个是进程运行状态或者cpu状态的记录信息,一个是mmu寻址用到的表,进程运行状态切换实际上在汇编里简单提了一下,如果保存状态,然后切回来,这个会在后面利用栈切换进程线程以及后面的fork()中提到,当然,fork里面讲到的东西太多了,具体还是需要看哈工大os课程,然后再来看这些图片补充细节问题。

最后,这里并不一定非常准确!但是大体是这么回事,仅仅是帮助理解os是如何工作的。

保护模式(段表、页表)

概要

如果下图看不懂,结合下面罗列的视频,以及前面我写的汇编笔记中的实模式保护模式,结合理解。

刚开始,这个概念很难理解,最后理解后,基本上就是查表完成映射这么回事了,并且搞清楚进入内核时,实际上偏移地址=线性地址=物理地址,给的地址就是物理地址,空间范围就是0-16M,到了用户态,根据段表可知,管理的虚拟地址空间为0-4G,只不过每个进程这里简单分配了64M,互不重叠,因此页目录表就一个,切换进程时根本不用切换页目录表了。

内存管理:其实就是段表页表保护模式下的内存管理,知道进程的段表什么结构,知道mem_map如何分配空闲物理页给进程的页表。

linux 0.11 内核代码 8086 保护模式_哔哩哔哩_bilibili

系统调用

概要

操作系统几乎所有主要的API都是通过系统调用实现的,后面的fork(),execve(),open(),read(),write(),close()等等,背后的工作流程几乎完全一样。

利用栈切换进程线程原理

概要

把进程看成游戏,当进入内核时,相当于你马上要关闭这个游戏,切换到另一个游戏,因此你需要存档,这个存档在这里是通过压入栈中(手动压入用户栈,或者内核级线程里面是通过中断压入内核栈),然后读档的方式就是把栈里面的东西pop到cpu里面。

实际上还能通过把存档信息放在tss结构体中,然后把tss结构体刷到cpu中就能完成切换。下一节会讲。

进程与fork()

概要

把fork如何创建复制一个进程的大部分流程画了图,并给了例子。

搞懂这个需要你对PCB非常了解,因为这里切换,主要就是对进程的一些信息操作,这个信息从cpu中弄到栈里面,然后弄到创建的新PCB里面,然后怎么切换,怎么返回,返回的时候会回到哪里。

并且复制的新进程,它的虚拟地址在哪里,主要就是cs,ds和用户栈的ss,esp,内核栈的ss0,esp0;然后它返回值eax是什么,父进程的返回值eax是什么。你可能还需要参考课本,看下这些细节,以及0号进程如何创建的。

最后,本笔记不会涉及进程调度,磁盘调度这些事情。本笔记只是os骨架的概要,了解os如何运行,关键的数据结构,以及内存分布。

进程管理:PCB结构,fork()工作原理,调度算法

文件系统

概要

第一层:最开始涉及的磁盘访问指令,完全就是IN,OUT,需要磁头,磁道,扇区三个参数,为了继续简化访问,

第二层:重新用块编址,然后写一套驱动,用块作为参数的新接口访问(需要知道磁头磁道扇区和块之间的映射),由于文件抽象为字节流,文件在磁盘上也需要按块存储,因此给文件分配物理块很重要,于是得到了inode,通过inode访问文件。这里提到的inode相当于页表。

第三层:对一大堆文件设计树状目录,可以用路径表示,也就是可以将路径解析找到inode,就能通过上层接口访问了,这一层抽象为通过文件路径访问。

第四层:前面是把数据写到缓冲区中,然后c语言抽象为FILE结构体,对缓冲区操作。

第五层:可以抽象为行和列访问,各种各样的数据结构。

除了文件是这么抽象的,其他的IO接口大致也有这么多层抽象过程,大致就这么回事,但是具体细学的话,里面又存在很多东西需要学,以后用到再学,现在简单懂个这么一个抽象过程和数据结构即可。