课程学习总结报告
计算机有"三大法宝",分别是存储程序计算机,函数调用堆栈和中断.
存储程序计算机:
冯·诺依曼(VonNeumann)体系结构,它是⼏乎所有计算机平台的基础,现代计算机⼏乎都是基于冯·诺依曼体系结构。
存储程序计算机的主要思想是将程序存放在计算机存储器中,然后按存储器中的存储程序的⾸地址,执⾏程序的第⼀条指令,以后就按照该程序中编写好的指令执⾏,直⾄程序执⾏结束。
我们可以把CPU看成一个循环,一直不断从内存⾥取下⼀条指令来执⾏。内存保存指令和数据,CPU负责解释执⾏指令,它们通过总线连接起来。
函数调用堆栈:
函数调用指令call执行时,堆栈指针esp递减4个字节(32位),并且调用后的指令地址(返回地址)被写入现在由esp引用的存储器位置,即返回地址被压入栈。然后将eip设置为指定为要调用的操作数的地址,并从该地址继续执行。
调用函数执行完毕,函数返回指令ret执行(不占用任何操作数),处理器首先从esp中包含的内存地址中读取值,然后将esp增加4个字节,从堆栈中弹出返回地址。eip设置为此值,并从该地址继续执行。返回调用前上下文。
中断:
为了处理是处理硬件外设I/O,有了中断机制这个东西。
中断分外部中断(硬件中断)和内部中断(软件中断)。内部中断⼜称为异常(Exception),异常⼜分为故障(fault)和陷阱(trap)。中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应。中断是异步的:由硬件随机产生,在程序执行的任何时候可能出现;异常是同步的:在(特殊的或出错的)指令执行时由CPU控制单元产生。
系统调用作为一种特殊的中断,就是利⽤陷阱(trap)这种软件中断⽅式主动从⽤户态进⼊内核态的。
此时就不得不牵扯到操作系统的“两把宝剑”进程上下文和中断上下⽂。
进程上下文是把系统提供给进程的处于动态变化的运行环境总和。
中断上下文它是一个内核控制路径,代表了中断发生时正在运行的进程执行。
中断的处理过程:
- 确定中断向量。
- 利用中断向量在IDT中找到对应中断门,在中断门中得到段选择符从而可以从GDT中找到中断服务例程的段基址。
- 确定中断发生的特权级合法(linux只有内核态和用户态两种特权级,此步用来检查中断程序的特权是否低于引起中断的程序的特权,低优先级程序不能引起高优先级程序)
- 检查是否发生特权级变化(用户态陷入内核态,这时候需要设置内核的堆栈),如果发生读取当前程序的tss段(通过tr寄存器读取)来选择新特权级的ss和esp指针,然后保存旧的ss和esp指针。
- 若发生的是故障,用引起异常的指令地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行。
- 在栈中保存eflags、cs和eip的内容。
- 如果异常产生一个硬件出错码,则将它保存在栈中。
- 装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。这对寄存器值给出中断或者异常处理程序的第一条指定的逻辑地址。
进程的切换:
一个进程的上下文(context)包括进程的状态、有关变量和数据结构的值、机器寄存器的值和PCB以及有关程序、数据等。
一个进程的执行是在进程的上下文中执行。
当正在执行的进程由于某种原因要让出处理机时,系统要做进程上下文切换,以使另一个进程得以执行。
当进行上下文切换时系统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程、并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。
系统调用的过程:
- 应用程序 代码调用系统调用( xyz ),该函数是一个包装系统调用的 库函数 ;
- 库函数 ( xyz )负责准备向内核传递的参数,并触发 软中断 以切换到内核;
- CPU 被 软中断 打断后,执行 中断处理函数 ,即 系统调用处理函数 ( system_call);
- 系统调用处理函数 调用 系统调用服务例程 ( sys_xyz ),真正开始处理该系统调用。
VFS虚拟文件系统:
虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个 抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据 结构;同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。
课程感受:
建议倒是不敢说,感受还是有一些的,首先非常感谢孟老师和李老师的认真教导,都是很负责的老师,疫情上网课对老师和同学都是不小的考验,上课时候老师一遍遍问同学听明白了吗真的很感动,没想到读研老师还可以这么认真负责,linux操作系统虽然后有意思,但是linux内核的确比较枯燥和困难,老师想讲的引人入胜也是非常困难的,个人也是能力有限,只能学懂里面的一部分。
整体来讲,俩位老师讲解内容搭配还是很适合同学的,理解linux系统内核对一个优秀软件工程的学生几乎是必须的,以后有机会,应该继续深入钻研。
最后,再次两位老师的教导和助教老师背后的帮助。