历时八周,完成了Linux内核分析的线上课程。在孟老师的引领下,完成了Linux内核核心进程相关的源代码阅读与过程追踪,一步步了解Linux系统中进程的前世今生,从出生到正常运行、切换的内核代码实现,在这个过程中孟老师的mykernel、MENUOS以及gdb调试工具都让学习过程变得更加顺利。
第一周的课程主要学习了32位系统下的一些常用汇编代码,常用寄存器,并且通过分析简单的系统调用学习系统调用过程中堆栈的变化,是了解 Linux内核的基础。
第二周的课程主要围绕孟老师编写的mykernel进行,基于mykernel编写简单的进程调度函数,主要理解进程调度过程中内核需要进程的工作,也就是运用第一周的汇编代码实现进程上下文的保存和恢复。
第三周课程最核心的内容运用gdb跟踪Linux内核启动过程,理解内核启动过程中0号进程,1号进程,2号进程的创建过程,通过自己阅读代码以及与阅读参考资料,可以知道0号进程也就是init-task,这个进程是由内核编写人员手动创建,并且在执行rest-init的过程中,通过调用kernel_thread函数创建两个进程,分别执行kernel-init和kthreadd函数,前者就是1号进程,最终启动init进程,后者是系统的2号进程,它是一个内核进程,管理内核资源。
第四周课程通过int0x80系统中断实现系统调用,分别用C代码和嵌入式汇编实现同一个系统调用。
第五周课程通过追踪系统调用过程,可以知道在系统调用的流程中,程序主要做了保存现场,根据%eax中保存的系统调用号执行对应的系统调用内核函数,恢复现场并返回到用户态这几部操作。
第六周课程通过追踪系统创建新进程的过程,可以知道所有的进程创建都是基于复制的方式,然后对子进程做一些特殊的处理保证子进程从ret_from_fork处开始正常执行。
第七周的课程围绕可执行程序的产生、ELF文件、参数的传递、动态链接等几个方面说明了可执行程序的装载。
第八周课程讲解了进程切换函数,一般进程切换的过程以及几个特殊的进程切换时机。
通过八周的课程,对Linux内核进程相关的内容有了深层次的认识,除了对代码、流程的学习理解,还学到了阅读大型工程代码的好方法,但是比较遗憾的就是时间不是那么的充裕,对于Linux内核的其它部分知识没有时间能跟着孟老师继续学习,此乃一大遗憾。
杨金龙原创作品转载请注明出处
课程信息:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000