您的位置:首页 > 运维架构 > Linux

Linux内核课程学习心得

2015-05-04 15:23 204 查看
罗晓波 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

不知不觉,八周课程一晃而过,回想起当初选择这门课到学习完最后一个课件,也是一个习惯的养成了,到现在我倒是习惯性地在周五和周日上一下课程主页,不过在这八周的线上课程学习中,我还是有所收获的,下面把我的一点小感想分享一下吧。

课程第一周,通过一段反汇编代码浅析计算机工作方式,这一周主要是通过实验“通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的”,通过反汇编,得到一段C程序的对应的汇编代码,通过在反汇编中esp,ebp,eip的变化以及堆栈的变化来说明了冯诺依曼体系结构下计算机的工作方式,函数的调用栈的状态变化等。

课程第二周,通过一段精简的进程切换代码,聊一下OS是如何工作,这一周主要通过老师给的一个精简的MyKernel 内核,分析精简的mykernel代码,Mykernel OS对于进程的启动以及切换较之linux 内核都是有一定相似性的,但是真正的linux内核考虑的东西远比这个mykernel多得多,但是都是从一个初始化上下文环境的函数开始执行,即start_kernel函数,创建很多进程或者fork若干进程,当中断发生的时候,如mykernel中就是时钟中断发生之后,接下来OS就会为各进程进行调度,在调度队列中选取出一个适合的进程,由CPU和内核堆栈保存前一个进程的各寄存器信息(进程描述块中的thread结构体保存大部分CPU寄存器,但是诸如eax、ebx等等这些通用寄存器是保存在内和堆栈中的),将eip指向要调度的进程执行的地址,开始执行。

课程第三周,初看linux内核启动过程,这一周主要通过用gdb来跟踪一下linux内核的启动过程,从start_kernel开始到结束的过程就是整个内核初始化的过程,在初始化之前,那个后来沦为idle进程的也就是内核静态创建的一个pcb,也就是0号进程,通过rest_init进一步fork出了两个进程,一个是init进程,另外一个是kthread进程。

课程第四周,谈谈对linux系统调用的理解,本周主要通过一个简单的系统调用,程序员通过API来进行系统调用,例如一些libc库提供的posix API,如getpid就是这样一个posix API,它提供了用户态到内核态的访问,在内核态保存大多数寄存器的内容;调用名为系统调用服务例程的响应的C函数来处理系统调用;退出到系统调用处理程序,用保存在内核栈中的值加载寄存器,cpu从内核态切换回用户态。

课程第五周,分析系统调用的处理过程(systemcall->iret),本周主要分析一下课程第四周的系统调用的处理过程。一张图以蔽之:



课程第六周,Linux内核创建一个新进程的过程,本周学习了linux内核在创建一个新进程的过程,通过系统调用,不管是clone、fork、还是vfork这三个系统调用都是对应的一个系统服务例程,那就是do_fork()函数,在dofork之后,就紧接着创建新进程的进程描述符以及子进程执行所需要的其他内核数据结构,也就是copy_process函数里所做的东西。由于将父进程的当前堆栈都拷贝到了子进程的堆栈中,在上述分析中,当子进程的进程描述符中的已经将eip、esp以及各寄存器和内核栈、数据段的值都准备好了,进程调度之后,便可以开始执行子进程了。

课程第七周,Linux内核如何装载和启动一个可执行程序,本周主要通过一个elf文件的执行过程,分析execve系统调用,当从内核态返回到用户态的时候,上下文被新的可执行的文件大面积更改和替换,原本调用系统调用的用户态代码也不会再继续执行了。

课程第八周,浅谈 进程调度的时机和进程切换,主要是学习了在schedule函数中,着重于switchto这个函数中的汇编代码,并通过堆栈即寄存器的变化,了解了进程间的切换时上下文的改变。

上面就是八周的mooc学习得清单列表,当然,在线下,我也学习了linux相关的知识,在对应着老师课堂的内容学习着深入理解linux内核书中提到的相关知识点,虽然有的只是从概念层面的了解,但是终归是有一定收获的,比如linux文件系统的挂载、start_kernel函数里面的初始化工作、linux通过8259A中断控制器对中断和异常的种种处理等等。

在学习《Linux内核分析》课程中最大的收获:

最大的收获就是掌握了如何去学习linux内核的方法,虽然linux内核庞大无比,但是就像老师说的那样,从start开始一环一环的研究,先搞清楚每一环之间的联系,弄清楚如何运转之后再结合书本和老师的讲解和互联网上的搜索深入的理解某一个环节,进行较为深入地学习,当然,每一环的学习最好都是有实验的辅助,效果是最佳的了。实验楼就是这样的一个环境,提供了方便的学习环境和支持。

学习完《Linux内核分析》课程后您最大的遗憾:

最大的遗憾莫过于自己没有亲手在自己的linux系统上,自己折腾一下属于自己的Mykernel,没有自己亲自去体会制作一个简易的linux系统的。这是我最大的遗憾了。不过后期有时间会弥补这个遗憾的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: