课程学习总结报告

课程学习总结报告

一、Linux基础结构模型

Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。

内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

Linux 内核有如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统等。

二、进程管理

1、进程的描述

在操作系统原理中,我们通过进程控制块PCB描述进程。为了管理进程,内核要描述进程的结构,我们也称其为进程描述符,进程描述符直接或间接提供了进程相关的所有信息。

在Linux内核中⽤⼀个数据结构struct task_struct来描述进程。struct task_struct的结构包括了进程的状态、进程双向链表的管理,以及控制台tty、⽂件系统fs的描述、进程打开⽂件的⽂件描述符fifiles、内存管理的描述mm,还有进程间通信的信号signal的描述等内容,十分庞大繁杂。值得一提的是,task_struct数据结构的最后是保存进程上下⽂中CPU相关的⼀些状态信息的关键数据结构thread。struct thread_struct数据结构内部最关键的是sp和ip。sp⽤来保存进程上下⽂中的ESP寄存器状态,ip⽤来保存进程上下⽂中的EIP寄存器状态。

2、进程的状态

操作系统原理中的进程有就绪态、运⾏态、阻塞态这3种基本状态,实际的Linux内核管理的进程状态则与原理稍有出入,如原理中的就绪态和运行态,在linux中都是TASK_RUNNING态。在Linux中,进程的状态划分比原理更加复杂,如终止态中又多了僵尸态;阻塞态也有两种:TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE。

3、进程调度

先到先服务算法、最短作业优先调度、优先级调度、 轮转法调度、多级队列调度、多级队列反馈调度等。一个进程的上下文(context)包括进程的状态、有关变量和数据结构的值、机器寄存器的值和PCB以及有关程序、数据等。一个进程的执行是在进程的上下文中执行。当正在执行的进程由于某种原因要让出处理机时,系统要做进程上下文切换,以使另一个进程得以执行。当进行上下文切换时系统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程、并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。

系统调用的过程:

  1. 应用程序代码调用系统调用xyz,该函数是一个包装系统调用的库函数xyz;
  2. 库函数xyz负责准备向内核传递的参数,并触发软中断以切换到内核态;
  3. CPU 被软中断打断后,执行中断处理函数 ,即系统调用处理函数system_call;
  4. 系统调用处理函数调用系统调用服务例程sys_xyz,真正开始处理该系统调用。

三、中断管理

为了处理是处理硬件外设I/O,有了中断机制这个东西。

中断分外部中断(硬件中断)和内部中断(软件中断)。内部中断⼜称为异常(Exception),异常⼜分为故障(fault)和陷阱(trap)。中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应。中断是异步的:由硬件随机产生,在程序执行的任何时候可能出现;异常是同步的:在(特殊的或出错的)指令执行时由CPU控制单元产生。

系统调用作为一种特殊的中断,就是利⽤陷阱(trap)这种软件中断⽅式主动从⽤户态进⼊内核态的。

中断的处理过程:
  1. 确定中断向量。
  2. 利用中断向量在IDT中找到对应中断门,在中断门中得到段选择符从而可以从GDT中找到中断服务例程的段基址。
  3. 确定中断发生的特权级合法(linux只有内核态和用户态两种特权级,此步用来检查中断程序的特权是否低于引起中断的程序的特权,低优先级程序不能引起高优先级程序)
  4. 检查是否发生特权级变化(用户态陷入内核态,这时候需要设置内核的堆栈),如果发生读取当前程序的tss段(通过tr寄存器读取)来选择新特权级的ss和esp指针,然后保存旧的ss和esp指针。
  5. 若发生的是故障,用引起异常的指令地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行。
  6. 在栈中保存eflags、cs和eip的内容。
  7. 如果异常产生一个硬件出错码,则将它保存在栈中。
  8. 装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。这对寄存器值给出中断或者异常处理程序的第一条指定的逻辑地址。

四、文件系统

1、简介

在LINUX系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。这样带来优势也是显而易见的:UNIX 权限模型也是围绕文件的概念来建立的,所以对设备也就可以同样处理了。

2、文件打开:

  1. 应用程序对open ( )的调用将引起内核调用服务例程sys_open ( )函数,该函数接收的参数为:要打开文件的路径名和访问模式等;
  2. 该系统调用成功后将返回一个文件描述符,也就是文件对象指针数组的一个索引;
  3. 系统调用不成功时返回-1。

3、文件关闭

  1. 用户程序通过close ( )系统调用关闭打开的文件,该函数接收的参数为要关闭文件的文件描述符。
  2. 内核服务例程为sys_close ( )函数。

4、读文件流程

  1. 进程调用库函数向内核发起读文件请求;
  2. 内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
  3. 调用该文件可用的系统调用函数read()。read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
  4. 在inode中,通过文件内容偏移量计算出要读取的页;
  5. 通过inode找到文件对应的address_space;
  6. 在address_space中访问该文件的页缓存树,查找对应的页缓存结点:
  7. 如果页缓存命中,那么直接返回文件内容;
  8. 如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;
  9. 文件内容读取成功。

5、虚拟文件系统

  1. 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;
  2. 同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。
  3. 系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
  4. 为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据 结构;
  5. 同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。

五、有关课程改进的建议

希望能够多点对书本知识理解的作业,感觉动手的作业很多,但是知识点理解的作业有点少。
最后,感谢老师和助教们在疫情期间依然坚守岗位,认真授课。

posted @ 2020-07-08 21:44  阿萨德发给  阅读(165)  评论(0编辑  收藏  举报