首页 > 其他 > 详细

课程学习总结报告

时间:2020-07-09 18:52:09      阅读:66      评论:0      收藏:0      [点我收藏+]

课程概述

Linux内核实现了操作系统的三大核心功能,即进程管理、内存管理和文件系统,对应操作系统原理课程中最重要的 3 个抽象概念是进程、虚拟地址和文件。其中,操作系统内核中最核心的功能是进程管理。课程总结也将围绕这三大核心进行展开。

进程

进程描述符PCB

在linux内核中,用tast_struct表示。
技术分享图片
其中有进程的状态、进程双向链表的管理,以及控制台tty、文件系统fs的描述、进程打开文件的文件描述符files、内存管理的描述mm,还有进程间通信的信号signal的描述等

进程管理

进程创建

在系统运行过程中,我们需要创建新的进程去执行不同的任务,这就涉及到进程创建的问题。进程的创建主要是通过复制现有进程来完成,在完成初始化后会获得0号进程、1号进程(所有用户态进程的祖先)、2号进程(所有内核进程的祖先)。通过fork可完成进程的创建,在课堂中我们详细分析了fork,辨别了其跟其他系统调用的区别(主要分清子进程什么时候执行)。

中断

为了实现进程切换,引入了中断的概念。中断可分为两大类:异常和中断。其中异常又分为 故障(Fault)和陷阱(Trap)。当需要使用系统调用时,就需要用到trap,从而实现从用户态到内核态。
在中断时需要完成中断上下文切换:CPU上下文的切换,如中断信号/中断指令、iret中断返回指令;保存现场和恢复现场,中断处理程序的头部和尾部。
下面简单总结一下中断过程:

  1. 确定与中断或异常关联的向量i(0 <= i <= 255)。

  2. 读中断描述符表(IDT)中的第i项。

  3. 通过第i项中的段选择符在GDT中查找相应的段描述符。后者指定中断或异常处理程序的段基地址。

  4. 权限检查:比较CPL与段描述符的DPL;比较CPL与门描述符的DPL。

  5. 检查是否发生了特权级的变化,若CPL不同于段描述符的DPL(从用户态陷入内核态),则:读取tr寄存器访问运行进程的TSS段;装载TSS中的ss与sp到寄存器(指向当前线程的内核栈);在新栈中保存ss和sp之前值

  6. 若发生的是故障则用引起异常的指令修改cs和sp寄存器的值,以使这条指令在异常处理结束后可以被再次执行。

  7. 在栈中保存flags,cs和ip的值。

  8. 如果异常产生一个异常操作码,则将它保存在栈中。

  9. 装载处理程序入口地址到cs和ip。

  10. 执行iret指令进行返回。

进程切换时机

当有了进程切换机制后,我们就需要确定什么时候要进行进程切换,这就涉及到进程调度算法。
首先,进程状态分为:运行态、就绪态、等待态。其中,LINUX把就绪态和运行态都归为TASK_RUNNING,在Linux内核中,当进程是TASK_RUNNING状态时,它是可运行的,也就是就绪态,是否在运行取决于它有没有获得CPU的控制权,也就是说这个进程有没有在CPU中实际执行。
在LINUX中进程调度算法主要有FIFO(先进先出)、Round Robin(时间片轮转)、CFS(Completely Fair Scheduler),需要根据不同的系统要求选择不同的策略。

内存管理

Linux操作系统中只是采用了INTELx86内存空间的 0 和 3 两个级别,分别对应内核态和用户态。用户态和内核态很显著的区分用法就是CS:EIP 的指向范围,在内核态时,CS:EIP 的值可以是任意的地址,在 32 位 Linux 系统上有 4GB 的进程地址空间,内核态下的这 4GB 的地址空间全都可以访问。但是在用户态时,只能访问 0x00000000~0xbfffffff 的地址空间,0xc0000000 以上的地址空间只能在内核态下访问
技术分享图片
在LINUX中,地址空间还分为逻辑地址、线性地址、物理地址

  1. 逻辑地址一般时用段地址:段内偏移量来表示,起源 16 位 x86 CPU 具有 20位的地址总线可以访问的地址空间也就从 64K 扩展到 1M
  2. 线性地址就是进程的地址空间里从 0 开始线性递增的地址空间范围里的地址,是逻辑地址经过段地址转换之后的地址
  3. 物理地址就是实际物理内存的地址,线性地址经过内存页转换之后就是物理地址
  4. 逻辑地址和线性地址在 32 位和 64 位上目前都是虚拟地址,需要依次经过分段映射和分页映射最后才转换成物理地址。这个映射计算地址的过程一般由 CPU 内部的MMU(内存管理单元)负责把虚拟地址转换为物理地址

文件管理

通常,虚拟文件系统分为三个层次:
技术分享图片

  1. 第一层为文件系统接口层,如open、write、close等系统调用接口。
  2. 第二层为VFS (Virtual File System)接口层。该层有两个接口:一个是与用户的接口;一个是与特定文件系统的接口。VFS与用户的接口将所有对文件的操作定向到相应的特定文件系统函数上。VFS与特定文件系统的接口主要是通过vfs-operations来实现的。
  3. 第三层是具体文件系统层,提供具体文件系统的结构和实现,包括网络文件系统,如NFS (network file system)。
    通过VFS就可以对不同文件系统进行支持。

以open系统调用过程为例

  1. 首先找到C库中的INT90,在中断异常表(参数为128)找到程序入口并完成初始化和注册,进行系统调用,其中包括保护现场、得到指令和参数等、在系统调用表中找到sys_open。这一过程涉及了中断及系统调用。
  2. 执行sys_open:查找命令、得到FCB,根据文件类型调用不同的文件打开函数,创建系统文件打开表(fs),创建进程文件打开表(fd数组,fd为指针数组,里面的指针指向fs),查看哪个进程空闲使其指向相应fs,fd返回。这一过程涉及文件管理。

心得体会及建议

通过两位老师的细心讲解,我深刻地了解到LINUX内核的运作机制,对操作系统有了更深的了解。比如以前只理解进程切换,现在能够深刻的了解具体的进程切换过程以及通过gdb调试跟踪内核是如何管理这一过程的。
我对这门课的建议是,孟老师在跟踪调试代码时,在最后希望可以给出整个执行过程的流程图。因为在执行过程中,涉及到多个函数,在听的过程中容易忘记,在最后给出流程图不但能方便记忆,也能方便总结。
总的来说,这门课对于我而言是有不少收获的,在这感谢两位老师的辛勤付出。

课程学习总结报告

原文:https://www.cnblogs.com/junljw/p/13275216.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!