Linux内核学习总结
首先很喜欢在课程中看到的一句话:
"不论你多么富有,多么有权势,当生命结束之时,所有的一切都只能留在世界上,唯有灵魂跟着你走下一段旅程。人生不是一场物质的盛宴,而是一次灵魂的修炼,使它在谢幕之时比开幕之初更为高尚。——稻盛和夫”
孟宁老师的linux内核分析课程如期结束了,通过这数周的学习,对于linux的系统内核有了一个相对清晰地认识,用户态和内核态之间的切换、可执行程序的调用、进程之间的切换……这些章节都让我觉得学到了很多自己从未接触过的知识,而且讲得深入浅出,很是受教。
-
Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 - 苏儿 - 博客园
- 本周 主要回顾了以前学习的C语言、汇编语言的基础知识,以及它们之间的相互转化。同时对于函数调用堆栈进行了复习和重新理解,并对参数传递进行了讲解,这些都可以看做是为后面几周的打基础而学习的知识吧。
-
Linux内核设计(第二周)——操作系统工作原理 - 苏儿 - 博客园
- 本周主要从一个小型的内核代码——mykernel出发,它基于Linux Kernel 3.9.4 source code。通过本讲的学习和实验,我们知道操作系统的核心功能就是:进程调度和中断机制,通过与硬件的配合实现多任务处理,再加上上层应用软件的支持,最终变成可以使用户可以很容易操作的计算机系统。在讲解中中。主要介绍了my_ schedule函数、my_ start_ kernel函数以及中断处理程序my_ time_ handler这三个函数。可以大致模拟内核进行中断上下文切换的过程。同时,还定义了mypcd的数据结构,通过自定义进程PCB结构,可以描述进程调度级进程上下文切换的大致过程。
-
Linux内核设计第三周——构造一个简单的Linux系统 - 苏儿 - 博客园
- 本周主要是通过gdb调试一个简单的系统内核代码,来理解和学习系统内核启动过程:在start_kernel内核启动后,rest_init()作为一个0号进程就一直存在;然后这个0号进程就创建了1号进程kernel_init,接下来还创建了其他的一些服务类的内核线程。
-
- 本周主要是通过gdb调试一个简单的系统内核代码,来理解和学习系统内核启动过程:在start_kernel内核启动后,rest_init()作为一个0号进程就一直存在;然后这个0号进程就创建了1号进程kernel_init,接下来还创建了其他的一些服务类的内核线程。
-
Linux内核设计第四周——扒开系统调用三层皮 - 苏儿 - 博客园
- 本周主要学习了系统调用库函数的过程,并对其中的寄存器变换,中断、API接口都进行了详细的描述。其中,形象的说了:系统调用的三层皮:xyz、system_call、sys_xyz。最后,学习了系统调用的参数传递的方法。
-
- 本周主要学习了系统调用库函数的过程,并对其中的寄存器变换,中断、API接口都进行了详细的描述。其中,形象的说了:系统调用的三层皮:xyz、system_call、sys_xyz。最后,学习了系统调用的参数传递的方法。
-
LINUX内核设计第五周——扒开系统调用的三层皮(下) - 苏儿 - 博客园
- 本周主要是通过学习system-call的代码,来理解系统调用系统调用的入口和退出过程:系统调用是通过比较的方法,在sys_call_table表中找到了相对应的函数入口点。其中具体寻址的方法:call *sys_call_table(,%eax,4) , 由于sys_call_table表中每一项占4字节,因此获得服务进程指针的计算方法就是先把eax保存的系统调用号乘以4,然后再与sys_call_table表的基址相加。 然后,进入到系统调用表查找到系统调用服务程序的入口函数的地址,再进行跳转。这样便完成了对sys_call_table的进入。……
-
Linux内核设计第六周 ——进程的描述和创建 - 苏儿 - 博客园
- 本周主要讲了进程的描述和创建,具体到进程的控制块pcb的组织形式,以及进程创建设计到的数据结构;详细分析了task_ struct结构的组成,以及其各部分的用途;分析了fork系统调用的执行过程和返回原理,强调了fork创建的子进程时通过ret_ from_ fork返回的;从sys_ clone代码出发,分析了do_ fork函数执行的关键过程。
-
linux内核设计第七周——可执行程序的装载 - 苏儿 - 博客园
- 本周主要学习了预处理、编译、链接和目标文件的格式——ELF。包括ELF格式的起源发展、ELF文件格式的分类、具体文件头的组成等。还介绍了程序是如何在计算机中执行的,即经过预编译、编译、汇编、链接的过程完成的。同时介绍了可执行程序的静态加载过程和动态加载过程。
-
- 本周主要学习了预处理、编译、链接和目标文件的格式——ELF。包括ELF格式的起源发展、ELF文件格式的分类、具体文件头的组成等。还介绍了程序是如何在计算机中执行的,即经过预编译、编译、汇编、链接的过程完成的。同时介绍了可执行程序的静态加载过程和动态加载过程。
-
LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 - 苏儿 - 博客园
- 本周主要学习进程的切换,讲解Linux系统的一般执行过程,最一般的情况是:正在运行的用户态进程X切换到运行用户态进程Y的过程要经过以下步骤: 1). 正在运行的用户态进程X。2). 发生中断:save cs:eip/esp/eflags(current) to kernel stack, then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack)。3). SAVE_ALL //保存现场,这里是已经进入内核中断处里过程。4). 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换。5). 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)。 6). restore_all //恢复现场。7). iret - pop cs:eip/ss:esp/eflags from kernel stack。8). 继续运行用户态进程Y。
总结:
-
知识内容
主要是学习了linux内核的一些内部工作机制、可以说是学习了一回专门针对于linux的操作系统。具体的理解和分析就不再赘述了,在每一章里都有相应的分析。 -
个人感想
从自己的学习过程来讲,通过mooc的视频课程学习的方式没有什么问题,而且在一定程度上可以优化学习过程:首先是学习的时间可以更灵活的分配,从而也减轻了课堂学习的压力;其次,通过多次的回放,知识掌握的更加牢固;最后,在视频学习的同时也在进行实践的操作,很有相辅相成的感觉。
当然也有一些遗憾,对于linux内核中庞大的代码段如果完全看完是不可能的,但是自己应该多花些时间尝试多分析一些代码,应该对内核的理解会有更深层次的理解。
总之,linux内核分析(孟宁)课程至此就画上了句号,很感谢老师的讲解和帮助,祝各位为课程付出的老师工作顺利,也祝收看此视频的同学学习快乐,有所进步,谢谢!