Linux操作系统分析复习
- 一、“操作系统是如何工作的”理解
- 二、系统调用工作机制的理解
- 三、Linux系统的执行过程的理解
- 四、文件系统注册
- 五、文件系统
- 5.1 课件
- 5.2 视频
- 5.3 VFS
- 五、中断
一、“操作系统是如何工作的”理解
OS的正常工作依赖于存储程序原理、堆栈、中断三个部分。 linux内核从一个初始化上下文环境的函数开始执行,即start_kernel函数,创建多个进程或者fork(创建一个与原来进程几乎完全相同的进程)若干进程,我们为每个进程维护一个进程描述和以及进程间的关系PCB。 当中断发生的时候,如mykernel中就是时钟中断发生之后,接下来OS就会为各进程进行调度,利用Swich_to函数在调度队列中选取出一个适合的进程(系统会根据中断向量号来调用相应的中断异常程序)。由CPU和内核堆栈保存当前进程的各寄存器信息(CPU要做两件工作,一是将当前的eip和esp压入到当前进程的内核栈,二是将esp指向当前进程的内核栈,并将eip指向中断处理入口,进入到内核态。),将eip指向要调度的进程执行的代码区,开始执行。
https://blog.csdn.net/ustc_max/article/details/9189863
二、系统调用工作机制的理解
我们以一个假设的系统调用xyz
如图,系统调用执行的流程如下:
- 应用程序代码调用系统调用
xyz
,该函数是一个包装系统调用的库函数xyz
; - 库函数
xyz
负责准备向内核传递的参数,并触发软中断以切换到内核态; - CPU 被软中断打断后,执行中断处理函数 ,即系统调用处理函数
system_call
; - 系统调用处理函数调用系统调用服务例程
sys_xyz
,真正开始处理该系统调用。
在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。系统调用表同理。
Linux 通过软中断实现从用户态到内核态的切换。用户态与内核态是独立的执行流,因此在切换时,需要准备执行栈并保存寄存器。 内核实现了很多不同的系统调用(提供不同功能),而系统调用处理函数只有一个。 因此,用户进程必须传递一个参数用于区分,这便是系统调用号( system call number )。 在 Linux 中,系统调用号一般通过 eax 寄存器来传递。
三、Linux系统的执行过程的理解
分进程创建、可执行文件的加载和进程执行进程切换
- 进程创建 http://www.cnblogs.com/vampirem/articles/3107140.html
- 可执行文件的加载 操作系统首先判断此命令并非shell命令,于是以linux可执行文件视之。shell父进程调用fork,创建一个新进程,此新进程即为可执行文件的进程,fork调用完成后,新进程获得了新的页目录项,除此之外与shell父进程共享同一套页表结构。此时切换到新进程执行,执行execve系统调用,获取可执行文件的header信息,将其拷贝到主存中,并为之建立新的页表结构。通过header信息,建立新进程的进程地址空间与可执行文件的映射关系。此时新进程的进程地址空间视图中代码段、数据段仍为空,可执行文件相应的数据仍未拷贝到主存中,通过header中指定的执行程序入口,逐步将相应的段数据拷贝到主存中,并利用缺页中断位置建立相应的页表结构。除了一些header信息,在整个加载过程中没有任何从磁盘到主存的数据拷贝,直到CPU引用一个未被映射的虚拟页导致缺页中断的发生,才会进行拷贝。此时,操作系统利用它的页面调度机制自动将页面从磁盘拷贝到主存储器中。 https://blog.csdn.net/bamboolsu/article/details/43064141
- 进程执行进程切换
- 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();
- 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;
- 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
四、文件系统注册
注册过程实际上将表示各实际文件系统的 struct file_system_type 数据结构的实例化,然后形成一个链表,内核中用一个名为 file_systems 的全局变量来指向该链表的表头。
当内核被编译时,就已经确定了可以支持哪些文件系统,这些文件系统在系统引导时,在 VFS 中进行注册。如果文件系统是作为内核可装载的模块,则在实际安装时进行注册,并在模块卸载时注销。 每个文件系统都有一个初始化例程,它的作用就是在 VFS 中进行注册,即填写一个叫做 file_system_type的数据结构,该结构包含了文件系统的名称以及一个指向对应的 VFS 超级块读取例程的地址,所有已注册的文件系统的file_system_type结构形成一个链表,为区别后面将要说到的已安装的文件系统形成的另一个链表,我们把这个链表称为注册链表,链表头由 file_systems 变量指定。 所有的数据要加载到内存后CPU才能够对数据进行处理。
每个设备在mount时都要搜索该注册链表,选择适合自己设备文件系统的一项,并从中取出read_super()函数获取设备的超级块(一个超级块对应一个文件系统,保存文件系统的类型、大小、状态等等),并解析其内容。因为每种类型文件系统的超级块的格式不同,并且各自有特定的信息,每种文件系统必须使用对应的解析函数,否则内核就因为不认识该文件系统而无法完成安装。
五、文件系统
5.1 课件
信息项(有序)是构成文件内容的基本单位,可以是一个字符,也可以是一个记录。系统为一个正在使用的文件分配读/写指针,建立在外存空间,直至删除或到期。 文件分类:源文件(ASCII、汉字)、目标文件(二进制)、可执行文件 文件控制块FCB,文件目录就是FCB的有序集合,Linux中FCB成为inode 超级块,存放已安装的文件系统的信息,存于主存,双向链表
为了避免一切从根文件目录开始,定义了工作/当前目录 硬连接:一个文件名代表了到对应文件的一个硬连接,允许一个文件拥有多个有效路径名(ln,不允许用户创建且需要在同一个文件系统下)。 软连接:符号连接,包含了到另一个文件的任意一个路径名(ln -s),类似快捷方式,方便文件管理,对象可以是不存在的文件名。
- 打开文件 建立用户与文件的联系,open(文件名,读写方式),返回一个FCB read(文件名,内存位置,记录键),读的是一个记录,写入一个文件和外存
5.2 视频
根文件系统:开机时自动挂载(类似于钩子)
Linux中文件系统分开放: /home用户存放数据的地方(独立文件系统)、/usr、/var /etc与/home实际上是切换到另一个文件系统 理解:看上去像是所有文件都在根目录下,实际上是目录树的形式挂载,Windows中则是使用同级磁盘CDE等
索引节点inode 保存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述,数据分成:元数据 数据本身 )。例如:文件大小,设备标识符,用户/组标识符,文件读取或修改的时间戳等等。 注意:inode有两种,一种是VFS的inode,一种是具体文件系统的inode。前者在内存中,后者在磁盘中。inode号是唯一的,表示不同的文件。其实在Linux内部的时候,访问文件都是通过inode号来进行的,所谓文件名仅仅是给用户容易使用的。
挂载点 空目录,挂了则不空;原本不空挂载会隐藏原本的文件,取消挂载则重现。任何目录都可以mount挂载一个文件系统,取消挂载umount
文件系统类型EXT4(扩展),也支持Windows下的FAT等。Linux下也可以用mount加载(-o loop) loop设备
创建文件系统(分区)–格式化mkfs sda硬盘,硬盘只有四个主分区,多出的只能作为逻辑分区
/etc/fstab记录自动装载的文件系统,Linux开机只挂载部分文件系统。
用户配额quota 限制用户使用文件大小,软限制(警告)、硬限制(错误)、宽容期(软限制变为硬限制)。/home目录常有,只能针对文件系统设置,不能针对目录。
级别:普通文件、目录、文件系统
https://blog.csdn.net/yuexiaxiaoxi27172319/article/details/45241923
5.3 VFS
Linux中的一个虚拟文件文件系统,也称为虚拟文件系统交换层(Virtual Filesystem Switch),是一种软件机制。
- 引入目的 (1)VFS对实际文件系统进行抽象,采用统一的文件系统向用户提供相应的一组统一的标准的文件操作接口(open,read,close,mount,mkdir等); (2)通过系统调用到VFS到实际文件系统的操作。
三层结构:
五、中断
中断信号:中断、异常
CPU与内存通过总线连接。 eip/ip指令指针(自加一) cs代码段 CS寄存器对应的段描述(基址) EIP存放的偏移量,就得到了一个完整的线性地址(完成了段式映射),再通过目录表、页表映射,获得真正的物理地址。
问题: 中断异常处理过程,常见的中断和异常,定时器也是。缺页异常为什么发生? 驱动和文件的关联,设备访问,设备管理。 中断异常系统调用,设备管理。中断怎么存的