Linux内核学习总结
2016-04-21 17:07 20135128 阅读(183) 评论(0) 编辑 收藏 举报Linux内核学习总结
符钰婧 原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
这八周以来,我从拼不出来"Linux"这个词到知道了很多专有名词,也能大概了解Linux的工作机制,这一系列的进步都是一周周积累下来的。现在回过头来看,有种阳光总在风雨后的感觉,虽然这个比喻好像不太恰当。
闲话少说,接下来就进入这次的正题。
一、首先是对Linux操作系统的理解
1、操作系统的三大功能:进程管理(最核心)、内存管理和文件系统
2、这张图是孟老师视频的截图,是典型的Linux操作系统架构
底层:磁盘管理、物理内存的管理、内存控制器和控制台等等
上一层:对硬件资源的管理
绿色层:内核的实现(CPU的调度、内存管理、虚拟内存、磁盘管理、文件系统等等)
再上一层:系统调用接口
橘色层:基础软件(shell、共享库lib、编译器、动态加载器等等)
顶层:用户程序
3、Linux系统的一般执行过程(从CPU的角度看)
在32位x86的系统下,一个进程的地址空间有4G;0到3G是用户态的,3G以上的部分仅仅是内核态可以访问的(对所有的进程来说,3G以上的部分是完全共享的)。
陷入内核态之后,进程X切换到了进程Y。
切换过程如下:
(1)正在运行的用户态进程X
(2)发生中断//把当前的CPU上下文压到当前用户态进程X的内核堆栈中,然后加载当前进程的内核堆栈的相关信息(当前中断对应的服务例程的起点、ss:esp等)。这些动作都是由CPU自动完成的
(3)SAVE_ALL //系统调用处理过程中保护现场使用的宏
(4)中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换//在中断处理过程中总有一个发生调度的时机,有可能会发生调度
(5)标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行,即这个next进程曾经做过prev)//这里是用户态进程Y的内核部分
(6)restore all//恢复现场
(7)iret //pop 出Y进程在发生中断时保存到内核堆栈中的信息
(8)继续运行用户态进程Y
内核实际上也可以比喻成出租车,哪个进程招手都可以陷入进内核态,做一些工作之后再返回到用户态;接下来发生中断又可以进入内核态;当出租车没有客人的时候,就进入CPU idle(0号进程)。
小结:内核是各种中断处理过程和内核线程的集合。
4、自己的理解
(1)Linux操作系统工作过程中最主要的事情就是进程的切换,在进程切换的过程中会发生中断处理,这时会有内核堆栈的切换,汇编代码是理解的关键。其中中断和中断返回过程会有一个CPU上下文的切换;在进程调度的过程中有一个进程上下文的切换,即从一个进程的内核堆栈切换到另一个进程的内核堆栈。
在理解进程切换的工作过程时,我们可以利用gdb命令对内核代码设置断点进行调试跟踪,其中switch_to、sys_clone、do_fork等等都是很重要的函数。
(2)在运行某个进程的时候,系统会先调用gets从用户态进入内核态,把各种信息压栈之后,进入系统调用等待键盘的输入,此时它处于阻塞态。在等待的过 程中CPU可能会先调度到执行其他的进程,当有键盘输入后,就会发生I/O中断,然后就可以调度回一开始的进程。当前进程执行完之后可能会进入idle, 也可能会执行其他进程。
在进程等待的过程中,若键盘输入了ls,CPU就会开始执行中断处理程序,进程管理就会切换到此进程,当gets系统调用获得数据后就会返回到用户态,继续执行下面的指令。
二、总结
学习完这个课程之后,我最大的收获是学到了一种新的,以前完全没有概念的知识,课程一开始讲到的一些关于寄存器的知识点也相当于让我复习了一遍之前学过的 东西。还有就是现在我能够分析一些相对简单的堆栈变化过程,看得懂一些简单的内核代码,记住了一些Linux命令行界面的操作指令。总的来说,就是以后听 到Linux这个名词再不会感到很陌生,因为每周的网课还是相当令人印象深刻的。