20135103王海宁
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、学习感想
九个星期的学习时间结束了,真的对linux是又爱又恨,爱它的变化多端应用性强,恨它的难以捉摸自己操作起来实在不容易。linux不同于所学的其他东西,捧着一本书死啃一个月也不会有什么进展,除了要自己动手实践之外,还需要一个领路人把你领进去,当你摸索到门道之后才能顺着大路走,否则可能会原地打转,甚至误入歧途,在此真的很荣幸碰到孟老师,将我领入linux的大门,让我去探索,去前进。孟老师的讲解是真心好,每周一个小时的视频,即使那不算实验,到后来,几乎每次都要花上三个多小时的时间去理解它,不下功夫真的跟不上,在此再次感谢孟老师的教导,以及网易云课堂提供的这么一个可以免费学习了解linux的机会,孟老师辛苦了,您的辛苦没有白费,学生们都很敬重您,感激您,感谢您的教导。
除了所学知识外,还有一点让我很感动的是,linux本身并没有一个目的,他并没有一个准确的目标说我的任务是什么,他就是一个内核,还有许多开发者从不同地方弄过来的东西,这些乱七八糟的东西拼凑在一起却成为了一大笔财富,他并没有说我做什么,我不做什么,他的存在就是为了方便所有人,用它去做所有可以的事情。
除了网易云的公开课,我们还跟着自己的老师上课,得知linux是开源的,就是一种分享,你可以从网站上找到任何你想要的,这不是为了自由,而是为了让所有人找到他们需要的,去更改,去定制自己的代码,给与人们方便。
linux最大的优点就是它将所有都视为文件,这样最大的好处就是便于管理,虽然应用上有些不便,但这也是一个相当好的思路。
二、每周重点
第一周:反汇编
顾名思义,就是将汇编语言变成电脑语言,从cpu的角度主要就是堆栈和出栈,将数据放入栈中进行存储、运算和输出,用过ebp,esp控制寄存器的变化
第二周:精简内核分析(基于时间片轮转)
这里我们了解了计算机的三大法宝:(1)存储程序计算机(2)函数调用堆栈(3)中断机制
第三周:跟踪分析内核的启动过程
rest_init()就是start_kernel从进程内核一启动的时候就一直会存在,就是0号进程;
0号进程创建了1号进程以及其他的一些服务的内核线程,这样整个系统就启动起来了。
第四周:系统调用
系统调用三层皮:(1)xyz( API ) (2)system_call( 中断向量 ) (3)sys_xyz( 服务程序 )
第五周:system_call过程分析
(1)int 0x80从用户态进入内核态,跳到system_call()函数处执行相应服务进程。在此过程中内核先保存中断环境,然后执行系统调用函数。
(2)system_call()函数通过系统调用号查找系统调用表sys_cal_table来查找具体系统调用服务进程。
(3)执行完系统调用后,iret之前,内核会检查是否有新的中断产生、是否需要进程切换、是否学要处理其它进程发送过来的信号等。
(4)内核是处理各种系统调用的中断集合,通过中断机制实现进程上下文的切换,通过系统调用管理整个计算机软硬件资源。
(5)如没有新的中断,restore保存的中断环境并返回用户态完成一个系统调用过程。
第六周:进程创建过程学习
(1)无论用三种系统调用clone、fork、vfork中的哪种来创建一个新进程,都是通过调用do_fork来实现的
(2)通过复制父进程PCB的task_struct创建一个新进程
(3)子进程修改复制后的PCB,如pid、进程链表等
(4)fork()系统调用产生的子进程从ret_from_fork处开始执行,p->thread.ip = (unsigned long)ret_from_fork
(5)可通过返回值判断当前进程是父进程还是子进程,父进程处返回进程号,子进程自己返回0
第七周:可执行文件的装载和运行
可执行程序是怎么得来的:C代码经过编译器的预处理编译、编译成汇编代码、编译器将其编译成目标代码、链接成可执行文件
Linux内核装载和启动一个可执行程序
(1)创建新进程
(2)新进程调用execve()系统调用执行指定的ELF文件
(3)调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文
ELF格式中主要有3种可执行文件:可重定位文件.o,可执行文件,共享目标文件
ELF可执行文件会被默认映射到0x8048000这个地址
命令行参数和环境变量是如何进入新程序的堆栈的
Shell程序-->execve-->sys_execve,然后在初始化新程序堆栈时拷贝进去。
先函数调用参数传递,再系统调用参数传递
当前程序执行到execve系统调用时陷入内核态,在内核中用execve加载可执行文件,把当前进程的可执行文件覆盖掉,execve系统调用返回到新的可执行程序的起点
动态链接库的装载过程是一个图的遍历过程,ELF格式中的.interp和.dynamic需要依赖动态链接器来解析,entry返回到用户态时不是返回到可执行程序规定的起点,返回到动态链 接器的程序入口
第八周:进程调度过程分析
Linux中进程切换的一般步骤为:
(1)检测当前进程的状态,挂起当前进程的IO请求以防止死锁
(2)获取当前运行CPU,以及它的可运行进程队列
(3)从进程队列中获取当前进程的task_struct,并通过进程调度算法从队列中选择一个合适的进程作为待调入进程
(4)检测待调入进程的状态以确保其正确性
(5)使用switch_to宏来进行当前进程与待调入进程的切换(期间完成新进程的资源准备工作)
(6)新进程完成schedule(),结束整个进程切换过程
三、博客汇总
第一周: http://www.cnblogs.com/haiye/p/5213800.html
第二周: http://www.cnblogs.com/haiye/p/5245593.html
第三周: http://www.cnblogs.com/haiye/p/5271563.html
第四周: http://www.cnblogs.com/haiye/p/5296174.html
第五周: http://www.cnblogs.com/haiye/p/5325347.html
第六周: http://www.cnblogs.com/haiye/p/5350333.html
第七周: http://www.cnblogs.com/haiye/p/5374272.html
第八周: http://www.cnblogs.com/haiye/p/5402162.html
四、总结
说实话,不是恭维,这门课的遗憾在于时间太短,好多东西没能继续学下去,如果孟老师能接着讲下去就好了,真的能学到很多东西。有些东西学的并不只是一门学科,更重要的是老师的思路,知识如果只是学到,而不能融会贯通,我觉得和没有学过差别不大,提纲挈领比硬塞知识,真的好的多太多,只有逻辑搞清楚,主线弄明白,脑子里的条理才会清晰,这样才能说真的我学了这门课。
虽然这门课在网易云上学完了,但我的课程还没有结束,感谢孟老师把我领进门,带我走过最开始的懵懂阶段,接下来我会自己认真的走下去。多谢孟老师,辛苦了。