课程学习总结报告

 

一、Linux系统基础结构

1.1 Linux系统整体结构层次
内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
课程学习总结报告_第1张图片
 
 

1.2 用户态和内核态

划分原因:计算机硬件系统资源有限,盲目给用户提供特权指令容易导致系统崩溃。

作用:减少有限资源的访问和使用冲突,使资源的访问更加有序和安全,系统稳定性和健壮性得到提高。

CPU总是处理如下状态之一:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

3、用户态,运行于用户空间。

结构展示如下:

课程学习总结报告_第2张图片

 

1.3 进程地址空间结构

Linux 操作系统体系结构划分为内核态和⽤户态。区分这两者的依据就是CS:EIP的指向范围,在内核态时,CS:EIP的值可以是任意的地址,比如在 32 位 Linux 系统上有 4GB 的进程地址空间,内核态下的这 4GB 的地址空间全都可以访问。但是在⽤户态时,只能访问 0x00000000~0xbfffffff 的地址空间,32位和64位的地址空间,如下图所示:
课程学习总结报告_第3张图片
 

 

二、Linux系统内核功能

2.1 内核功能结构概述

  Linux系统内核的核心功能和对应实体概念如下所示,决定着系统的性能和稳定性:

功能模块 实体概念
进程管理 进程
内存管理 虚拟地址
文件系统 文件
 
  操作系统内核中最核⼼的功能是进程管理,各个部分底层驱动以及一组系统接口一起,组成了Linux系统工作的体系结构,系统调用层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。系统调用借口实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到系统调用接口的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。
课程学习总结报告_第4张图片
 
 

2.2 内存管理 

        对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux  采用了称为“虚拟内存”的内存管理方式。Linux  将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

  不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。

   为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。

2.3 进程管理

  进程实际是某特定应用程序的一个运行实体。在 Linux  系统中,能够同时运行多个进程,Linux  通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序schedule。struct list_head tasks把所有的进程⽤双向链表链起来,⽽且还会头尾相连把所有的进程⽤双向循环链表链起来。

       进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。内核通过系统调用接口提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec、clone 或 vfork),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。总结如下:

进程切换由如下两步完成

【1】切换页全局目录以安装一个新的地址空间,

【2】切换内核态堆栈和硬件上下文,例如:CPU寄存器等

进程创建小结

linux提供了如下几个系统调用来创建和终止进程:
fork、vfork、clone来创建新进程
exec:用于一个新程序
exit:用于终止进程

进程撤销

终止:释放进程占有的大部分资源

删除:彻底删除进程的所有数据结构

2.4 文件系统

  虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等, 

       虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。

  在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

        因此,用户和进程不需要知道文件所在的文件系统类型,VFS结构解释如下:

课程学习总结报告_第5张图片

 

 

三、中断举例(键盘中断)

3.1 普通系统调用重点
由int $0x80或syscall指令触发,分为如下三个步骤:
保存现场:重点是保存栈顶指针寄存器、指令指针寄存器、标志寄存器等内容到内核堆栈。
执行内核处理函数:通过系统调用号执行对应的内核处理函数,系统调用号存放在EAX寄存器里面。
恢复现场:将栈顶寄存器、指令指针寄存器、标志寄存器等从内核堆栈中恢复到对应寄存器中,从触发指令的下一条开始继续执行。
3.2 键盘中断的处理过程
【1】当用户按键时,键盘接口会得到一个代表该按键的键盘扫描码,同时产生一个中断请求。
【2】键盘中断服务程序先从键盘接口取得按键的扫描码,然后根据其扫描码判断用户所按的键并作相应的处理。
【3】最后通知中断控制器本次中断结束并实现中断返回。
细细区分一下按下和松开的瞬间:
当键盘上有键按下时,会产生该键的扫描码,并被送入端口地址为60h的寄存器中。
然后,CPU会接受到9h号中断,如果该键是字符码,会将扫描码连同字符码(ASCII码)一起放入缓冲区,而如果该键是控制键和切换键,则会改变内存中对应键盘状态的字节中。 
当键被松开时,也会产生中断,这时,送入60h端口的,不叫“扫描码”,而叫“断码”。断码=扫描码+80h,即1字节的扫描码最高位均为0,将最高位换1,就是对应键的断码。

按键功能类型:

若用户按下双态键(如:Caps Lock、Num Lock和Scroll Lock等),则在键盘上相应LED指示灯的状态将发生改变;
若用户按下控制键(如:Ctrl、Alt和Shift等),则在键盘标志字中设置其标志位;
若用户按下功能键(如:F1、F2、…等),再根据当前是否又按下控制键来确定其系统扫描码,并把其系统扫描码和一个值为0的字节存入键盘缓冲区;
若用户按下字符键(如:A、1、+、…等),此时,再根据当前是否又按下控制键来确定其系统扫描码,并得到该按键所对应的ASCII码,然后把其系统扫描码和ASCII码一起存入键盘缓冲区;
若用户按下功能请求键(如:Print Screen等),则系统直接产生一个具体的动作。 
  此外:当按下“普通键”时,它的低8位数存放该字符的ASCII码。对于特殊键,低8位为0。特殊键包括箭头键、功能键等。高8位字节存放该键的扫描码(感觉此处扫描码应该指的是特殊键所对应的扩充的ASCII码。
 
四、Linux操作系统分析心得体会
在疫情的网课学习期间,我认为自己有几个方面的提高和认识:
第一个是对Linux整体的结构和运行机制有了一个大局上的整体把握,虽然是在线听课,但是在孟老师的带领下可以做到紧随课堂思考,尽管和老师的沟通有变少,但是通过自己课后的及时补充和进一步探索,也可以达到不低于线下上课的效果。
第二个是在进程管理、中断处理和文件系统方面,有了进一步的深入了解,这是以前没有经历过的学习,跟随老师进一步探索Linux内核处理事件的机制,有助于我自己基于Linux系统开发我自己的Linux项目。
第三个是学习了很多在实际应用中的技能,包括开发技能和调试技能,比如常用的Linux命令、汇编语言基础、用gdb去跟踪调试Linux内核启动过程和系统调用的内核处理过程、Linux系统一般的执行过程等等。
 

 

你可能感兴趣的:(课程学习总结报告)