课程学习总结报告

一、课程概述

课程的主要内容为Linux源码阅读、编译调试和启动,可执行程序工作原理,进程的创建和切换,进程管理,中断和异常,linux驱动管理,linux文件系统,linux时钟和定时测量等。

下面分别对本次Linux课程进行总结

下面对各个模块分别做一些总结,其中会穿插该模块与其他模块的关系。

二、Linux中的系统调用

1、用户态和内核态

宏观上 Linux 操作系统的体系架构分为用户态和内核态。计算机的硬件资源是有限的,为了减少有限资源的访问和使用冲突, CPU 和操作系统必须提供一些机制对用户程序进行权限划分。现代的 CPU 一般都有几种不同的指令执行级别,就是什么样的程序执行什么样的指令是有权限的。在高的执行级别下,代码可以执行特权指令,访问任意内存,这时 CPU 的执行级别对应的就是内核态,所有的指令包括特权指令都可以执行。相应的,在用户态(低级别指令),代码能够掌控的范围会受到限制。为什么会出现这种情况呢?其实很容易理解,如果没有权限级别的划分,系统中程序员编写的所有代码都可以使用特权指令,系统就很容易出现崩溃的情况。因为不是每个程序员写的代码都那么健壮,或者说会非法访问其他进程甚⾄内核的资源,就会产生信息安全问题,这也是操作系统发展的过程中保证系统稳定性和安全性的一种机制。让普通程序员写的用户态的代码很难导致整个系统的崩溃,而操作系统内核的代码是由更专业的程序员写的,有规范的测试,相对就会更稳定、健壮

2、系统调用过程

系统调用陷入内核态,从用户态堆栈转换到内核态堆栈,然后把相应的CPU关键的现场栈顶寄存器、指令指针寄存器、标志寄存器等保存到内核堆栈,保存现场。系统调用入口的汇编代码还会通过系统调用号执行系统调用内核处理函数,最后恢复现场和系统调用返回将CPU关键现场栈顶寄存器、指令指针寄存器、标志寄存器等从内核堆栈中恢复到对应寄存器中,并回到用户态int $0x80或syscall指令之后的下一条指令的位置继续执行

三、Linux中的进程

1、进程创建过程

进程创建可以通过fork,vfork,clone三个系统调用实现,它们都是通过do_fork函数实现进程创建的,在do_fork函数中,以ret_from_fork函数为执行起点,复制父进程的内存堆栈和数据,并修改某些参数实现子进程的定义和初始化,创建子进程的工作完成后,通过sys_call exit函数退出并pop父进程的内存堆栈,实现新进程的创建工作。fork创建的新进程是和父进程(除了PID和PPID)一样的副本,包括真实和有效的UID和GID、进程组合会话ID、环境、资源限制、打开的文件以及共享内存段。根据代码的分析,do_fork中,copy_process管子进程运行的准备,wake_up_new_task将子进程加入到就绪队列等待调度执行。

2、进程调度

Linux内核通过schedule函数实现进程调度, schedule函数负责在运行队列中选择一个进程,然后把它切换到CPU上执行。所以调用schedule函数一次就是进程调度一次,有机会调用schedule函数的时候就是进程调度的时机

进度调度可以分为两个层次,一个是策略,一个是算法。
进程调度策略:首先要考虑这个策略的整体目标,是追求资源利用率最高,还是追求响应最即时,或是追求其他的特定⽬标。为了满足定下的这些目标,就需要找对应的算法或机制作为对策,这就是进程调度策略,显然进程调度策略站的层次更高。
进程调度算法:接下来考虑如何实现进程调度策略来达成设定的目标。是用数组、链表、图,还是树来存储就绪进程呢?在加在就绪队列时就排序,还是调度时再排序?时间复杂度可以接受吗?这些具体的实现就是进程调度算法需要考虑的问题。

Linux系统中常用的几种调度策略为:SCHED_NORMALSCHED_FIFOSCHED_RRSCHED_BATCH。其中SCHED_NORMAL是用于普通进程的调度类,而SCHED_FIFO和SCHED_RR是用于实时进程的调度类,优先级高于SCHED_NORMAL。内核中根据进程的优先级来区分普通进程与实时进程

四、时钟

主要用于时间片的计时,进程运行时间。和操作系统的墙上时间,即显示的年月日具体。

Linux在启动时首先会去读RTC,RTC是存储在单独的一个结构里,有单独的供电。在系统关闭的情况下,也在进行计时。Linux启动过程中会注册时钟源。根据优先级来选择具体的时钟源,优先级为(pit、tsc)。根据优先级选择具体的时钟源。选择时钟源后会定期产生时钟中断(与中断的关系)。产生时钟中断的过程中会减去当前进程时间片。若当前时间片用完则会调用切换函数。此外也会去更新墙上时间。

五、中断

中断处理流程总结

(1) 发生中断后,CPU执行异常向量vector_irq的代码;

(2)在vector_irq里面,最终会调用中断处理C程序总入口函数asm_do_IRQ();

(3)asm_do_IRQ()根据中断号调用irq_des[NR_IRQS]数组中的对应数组项中的handle_irq();

(4)handle_irq()会使用chip的成员函数来设置硬件,例如清除中断,禁止中断,重新开启中断等;

(5)handle_irq逐个调用用户在action链表中注册的处理函数。

  ==> 中断体系结构的初始化,就是构造irq_desc[NR_IRQS]这个数据结构;用户注册中断就是构造action链表;用户卸载中断就是从action链表中去除对应的项。

六、设备驱动

1、设备驱动的作用

驱动是应用软件和硬件的桥梁

  • 它使得应用软件只需要调用系统软件的应用编程接口(API) 就可让硬件去完成要求的工作。
  • 驱动程序沟通着硬件和应用软件, 而驱动工程师沟通着硬件工程师和软件工程师。

2、Linux设备

  • 字符设备
  • 块设备
  • 网络设备

3、Linux驱动的层次结构

4、注册设备驱动程序

  • 注册一个设备驱动程序意味着把它与对应的设备文件连接起来
    • 使得对设备文件发出的系统调用可以由内核转化为相应的设备驱动程序对应的函数
    • 按照设备驱动程序模型, 分配一个新的device_driver描述符, 对应到设备文件上
  • 访问一个没有注册设备驱动程序的设备文件将会返回错误码-ENODEV

七、文件系统

1、文件系统概念

  • 通常,系统为一个正在使用的文件提供读和写指针。
    • 读指针用来记录文件当前的读取位置,它指向下一个将要读取的信息项;
    • 写指针用来记录文件当前的写入位置,下一个将要写入的信息项将被写到该处。
  • 文件建立在外存空间,以便使文件能够长期保存。即:文件一旦建立,就一直存在,直到被删除或超过事先规定的保存期限。

文件控制块FCB

  • 文件控制块FCB是系统为管理文件而设置的一个数据结构。
  • FCB是文件存在的标志,它记录了系统管理文件所需要的全部信息。
  • FCB通常应包括以下内容:
    • 文件名、文件号、用户名;
    • 文件的物理位置、文件长度;
    • 记录大小、文件类型、文件属性;
    • 共享说明;
    • 文件逻辑结构、文件物理结构;
    • 建立文件的日期和时间、最后访问日期和时间、最后修改日期和时间;
    • 保存期限等。

文件多级目录结构

虚拟文件系统的三个层次

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

盘上的结构

  • 引导控制块:操作系统的初始引导块,用以读入并启动操作系统。一个文件系统,只有根文件系统才含有引导控制块。典型地,逻辑盘的第一块或作为引导控制块或空闲不用。在UFS中,被称为引导块;在NTFS中,被称为引导扇区。
  • 盘控制块:包含整个逻辑盘的资源管理信息,如逻辑盘中的块数、块大小、空闲块数、空闲块地址、空闲FCB数以及FCB地址。通常被称为超级块。
  • 目录结构:被用来组织文件的。
  • FCB:包含文件的属性信息,如文件访问权限、大小、存储地址。被称为i节点(inode)

Linux总结

  在Linux系统分析这门课程中,通过内核源代码和知识点结合的方式学习Linux,在实验中通过自己动手运行和调试内核,知晓了操作系统内核的结构和设计原理,一个操作系统是如何运作起来的,系统的各个功能之间是如何分工协作的,这让课程不仅仅是停留在理论阶段,学完之后加深了对操作系统的理解。

posted @ 2020-07-09 14:36  KTT飞  阅读(260)  评论(0)    收藏  举报