Linux内核学习总结

黄志恒
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

两个月的学习匆匆而过,现在来总结下这两个月在MOOC学习孟老师的Linux内核分析的收获。

首先是敢于阅读汇编代码了。虽然在整个学习过程中并没有遇到很负责的汇编代码,但是经过这个课程的学习后,对于汇编代码没有学习前的那种恐惧了。学会阅读汇编代码对于学习Linux内核还是十分重要的。因为能够阅读汇编代码,才能知道内核关键代码的执行过程。能够阅读汇编代码,也才能知道栈在Linux操作系统中具体是怎么运用的,这样也才能够明白Linux操作系统的基本运行机制。

其次是知道了中断在Linux操作系统的重要地位,也知道了中断在发生时内核做的关键工作。了解了中断机制,就能够分析操作系统切换进程的关键步骤。进程的切换可是操作系统中至关重要的环节。当然理解中断的过程中,汇编代码的阅读是不可避免的。在理解中断和分析进程上下文切换的过程中,我还了解了内核态与用户态这两个概念。Linux操作系统将进程和内存分为用户态和用户态来区分不同的优先级,来做权限管理。

之后就是内核的启动过程了。这个过程是一个零生一,一生二,阴阳生万物的过程。当Linux内核经过把各种资源和环境初始化之后把自己启动起来了,这时候是产生了0号进程。

再之后是对操作系统中提供的调用的分析。这一节的学习扫清了我之前的很大的盲点。就是在c语言中调用time等函数为什么就能得到操作系统的当前时间等。原来这一个过程需要API,中断服务程序,内核服务程序共同完成的。一个系统调用就经历了Linux内核的一个经典处理过程了。用户态->中断->内核服务->返回用户态。

之后是Linux系统创建子进程的过程了。在Linux操作系统中有一个进程树,每一个进程都会有自己的父进程。而0号进程是所有内核线程的祖先,1号进程是其他用户态进程的祖先。这里的细节是创建系统的函数在最后都是通过调用do_fork()来创建进程的。当父进程开始创建子进程的时候,依然要经历用户态->中断->内核服务->返回用户态。但是这时返回的已经不是父进程的用户态了,而是返回的子进程的用户态。

再下面是Linux内核是如何装载一个可执行程序的。这一节的学习对于码农的帮助是极大的。Linux内核装载一个可执行程序可以很清晰的学习到我们编写出来的高级语言代码是怎么一步一步变成最后被操作系统执行的ELF格式的文件的。而操作系统在执行ELF格式文件的时候,它又是怎么再具体执行的。具体过程这里就不在赘述,但是学习这一章节揭开了我们的代码被执行过程的面纱。

最后是内核对进程的切换和进程调度。进程调度无疑是操作系统的一个重头戏。当然,中断处理也在这场重头戏中扮演了重要戏份。这一过程需要注意的是进程切换和调度的时机,进程状态的不断切换,以及用户态进程和内核态线程在切换时的不同。

个人总结
经过这两个月的学习,验证了我之前对Linux操作系统的感觉:它是一个极其复杂的大程序。说其极其复杂是指它的每个关键步骤都要考虑初始化很多资源、环境,要考虑很多出错情况已经对出错情况的处理。这些内容在课程中没有过多的将,但是在阅读内核源码的时候看到的大片的代码都是关于这方面的。但是Linux操作系统的运行原理也不是很负责,通过这两个月的学习。使我知道了Linux内核关键过程的工作原理。特别是它在处理用户编写的代码和执行用户程序的过程对我帮助是最大的。作为一个码农,知道自己的代码在操作系统中的经历过程无疑是对自己编写代码的一个巨大帮助。

当然课程上也有遗憾。两个月中每周只有一次课时间对于学习Linux内核是远远不够的。还有很多内容没有涉及。而且没有经过很多实际动手去写代码,对于内核处理原理的运用上面很模糊。这方面的知识就需要自己在以后的时间里去练习了。毕竟师傅领进门,修行在个人。

下面把这两个月写的博客贴出来,希望对自己还有看客能有一些帮助:
1、《简单讨论操作系统的工作机制 》http://blog.csdn.net/shazhoulada1/article/details/44063107
关键字:汇编代码,程序执行在栈中运行的过程

2、《操作系统的“两把剑”:中断上下文切换和进程上下文切换》http://blog.csdn.net/shazhoulada1/article/details/44245741
关键字:中断上下文切换,进程上下文切换

3、《从start_kernel开始Linux内核启动》http://blog.csdn.net/shazhoulada1/article/details/44344691
关键字:start_kernel源码,Linux内核启动

4、《Linux系统调用的“三层皮”:API,中断服务程序,内核服务程序》http://blog.csdn.net/shazhoulada1/article/details/44593115
关键字:Linux系统调用的过程

5、《详细分析system_call》http://write.blog.csdn.net/postlist
关键字:Linux系统调用的一个实际例子

6、《Linux创建子进程的具体过程》http://blog.csdn.net/shazhoulada1/article/details/44957707
关键字:Linux创建子进程的过程

7、《Linux内核如何装载和启动一个可执行程序》http://blog.csdn.net/shazhoulada1/article/details/45102829
关键字:内核装载和启动一个可执行程序的过程

8、《Linux进程调度与进程切换》http://blog.csdn.net/shazhoulada1/article/details/45132485
关键字:Linux进程调度与进程切换

网易MOOC课程《Linux内核分析》http://mooc.study.163.com/learn/USTC-1000029000#/learn/announce
《实验楼》https://www.shiyanlou.com/courses/

感谢孟宁老师的授课。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值