课程学习总结报告

课程学习总结报告

请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型

进程调度:

从⽤户程序的⻆度看进程调度的时机⼀般 都是中断处理后和中断返回前的时机点进⾏,只有内核线程可以直接调⽤schedule函数主动发起 进程调度和进程切换。

调⽤schedule函数的时机主要分为两类:

  1. 中断处理过程中的进程调度时机,中断处理过程中会在适当的时机检测 need_resched标记,决定是否调⽤schedule()函数。
  2. 内核线程主动调⽤schedule(),如内核线程等待外设或主动睡眠等情形下,或 者在适当的时机检测need_resched标记,决定是否主动调⽤schedule函数。

CPU在任何时刻都处于以下3种情况之⼀:

  运⾏于⽤户态,执⾏⽤户进程上下⽂。 

  运⾏于内核空间,处于进程(内核线程)上下⽂。 

  运⾏于内核空间,处于中断(中断处理程序ISR,包括系统调⽤处 理过程)上下⽂。 

说明:应⽤程序通过系统调⽤陷⼊内核,或者当外部设备产⽣中断信号时, CPU就会调⽤相应的中断处理程序(包括系统调⽤处理程序),此时 CPU处于中断上下⽂。

 

进程分类

资源消耗性:I/O消耗型进程。计算消耗型进程。

按响应时效对进程分类:批处理进程,交互式进程;实时进程。

 

进程切换:为了控制进程的执⾏,内核必须有能⼒挂起正在CPU上运⾏的进程,并 恢复执⾏以前挂起的某个进程。这种⾏为被称为进程切换,任务切换或 进程上下⽂切换。

 

进程上下文包括:

  1. ⽤户地址空间:包括程序代码、数据、⽤户堆栈等
  2. 控制信息:进程描述符、内核堆栈等。
  3. 进程的CPU上下⽂,相关寄存器的值。

 

在实际代码中,每个进程切换基本由两个步骤组成:

1.切换⻚全局⽬录(CR3)以安装⼀个新的地址空间,这样不同进程的虚拟地 址如0x804840032x86)就会经过不同的⻚表转换为不同的物理地址。 

2.切换内核态堆栈和进程的CPU上下⽂,因为进程的CPU上下⽂提供了内核执 ⾏新进程所需要的所有信息,包含所有CPU寄存器状态。

 

进程上下文和中断上下文:

进程上下⽂切换时需要保存要切换进程的相关信息(如thread.spthread.ip),这与中断上下⽂的切换是不同的。中断是在⼀个进程当中 从进程的⽤户态到进程的内核态,或从进程的内核态返回到进程的⽤户态,⽽切换进程需要在不同的进程间切换。但⼀般进程上下⽂切换是嵌 套到中断上下⽂切换中的,⽐如前述系统调⽤作为⼀种中断先陷⼊内核, 即发⽣中断保存现场和系统调⽤处理过程。其中调⽤了schedule函数发 ⽣进程上下⽂切换,当系统调⽤返回到⽤户态时会恢复现场,⾄此完成 了保存现场和恢复现场,即完成了中断上下⽂切换。

 

中断上下⽂和进程上下⽂的⼀个关键区别是堆栈切换的⽅法。

中断是由CPU实现的,所以中断上下⽂切换过程中最关键的栈顶寄存器sp和指令指针寄存器ip 是由CPU协助完成的;

进程切换是由内核实现的,所以进程上下⽂切换过程中最关键的栈顶寄存器sp切换是通过进程描述符的thread.sp实现的,指令指针寄存器ip的切换是在内核堆栈切换的基础上巧妙利⽤call/ret指令实现的。

 

文件系统

分区与文件系统

对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统。其主要组成有inode和block。

inode:一个文件占用一个Inode,记录文件的属性,同时记录文件的内容所在的block编号

block:记录文件的内容,文件太大,会占用多个block。

 在Linux中,使用的时Ext2文件系统,当要读取一个文件的内容时,现在inode中查找文件内容所在的所有block,然后把所有block的内容读出来。这种文件系统使用的时索引。如下图所示。

Linux系统的⼀般执⾏过程:

(1)正在运⾏的⽤户态进程X

2)发⽣中断(包括异常、系统调⽤等),CPU完成load cs:rip(entry of a specific ISR),即跳转到中断处理程序⼊⼝。 

3)中断上下⽂切换,具体包括如下⼏点:

• swapgs指令保存现场,可以理解CPU通过swapgs指令给当前CPU寄存器状态做了⼀个快照。

• rsp point to kernel stack,加载当前进程内核堆栈栈顶地址到RSP寄存器。快速系统调⽤是由系统调⽤⼊⼝处的汇编代码实现⽤户堆栈和内核堆栈的切换。 

 • save cs:rip/ss:rsp/rflags:将当前CPU关键上下⽂压⼊进程X的内核堆栈,快速系统调⽤是由系统调⽤⼊⼝处的汇编代码实现的。 

此时完成了中断上下⽂切换,即从进程X⽤户态到进程X的内核态。

4)中断处理过程中或中断返回前调⽤了schedule函数,其中完成了进程调度算法选择next进程、进程地址空间切换、以及switch_to关键的进程上下⽂切换等。 

5switch_to⽤了__switch_to_asm汇编代码做了关键的进程上下⽂切换。将当前进程X的内核堆栈切换到进程调度算法选出来的next进程(本例假定为进程Y)的内核堆 栈,并完成了进程上下⽂所需的指令指针寄存器状态切换。之后开始运⾏进程Y(这⾥进程Y曾经通过以上步骤被切换出去,因此可以从switch_to⼀⾏代码继续执⾏)。 

6)中断上下⽂恢复,与(3)中断上下⽂切换相对应。注意这⾥是进程Y的中断处理过程中,⽽(3)中断上下⽂切换是在进程X的中断处理过程中,因为内核堆栈从进程X 切换到进程Y了。

7)为了对应起⻅中断上下⽂恢复的最后⼀步单独拿出来(6的最后⼀步即是7iret - pop cs:rip/ss:rsp/rflags,从Y进程的内核堆栈中弹出(3)中对应的压栈内容。此时完 成了中断上下⽂的切换,即从进程Y的内核态返回到进程Y⽤户态。注意快速系统调⽤返回sysretiret的处理略有不同。

8)继续运⾏⽤户态进程Y

 

运行ls指令过程

 内存分配

采用malloc和free是如何分配和释放内存。

当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 
1、检查要访问的虚拟地址是否合法 
2、查找/分配一个物理页 
3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 
4、建立映射关系(虚拟地址到物理地址) 

posted @ 2020-07-08 09:59  SA19225251  阅读(158)  评论(0编辑  收藏  举报