Linux内核学习总结
20135224陈实 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
第一部分--博客汇总:
计算机如何工作小解
http://www.cnblogs.com/chuishi/p/5209470.html
操作系统工作小解
http://www.cnblogs.com/chuishi/p/5246278.html
跟踪分析Linux内核的启动过程
http://www.cnblogs.com/chuishi/p/5269029.html
2种系统调用小结
http://www.cnblogs.com/chuishi/p/5299057.html
分析system_call中断处理过程
http://www.cnblogs.com/chuishi/p/5322754.html
Linux内核创建一个新进程的过程
http://www.cnblogs.com/chuishi/p/5347436.html
Linux内核如何装载和启动一个可执行程序
http://www.cnblogs.com/chuishi/p/5371649.html
理解进程调度时机跟踪分析进程调度与进程切换的过程
http://www.cnblogs.com/chuishi/p/5400943.html
第二部分--linux学习小结:
操作系统工作第一阶段:进程从用户态切换到内核态 第二阶段:中断处理 第三阶段:进程切换
内核启动过程为:道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)
对于系统调用的过程:执行用户程序(如:fork)--系统调用号并执行int $0x80产生中断--SAVE_ALL--进行中断处理,根据系统调用表调用内核函数--执行内核函数--执行RESTORE_ALL并返回用户模式
对于system_call函数是找到具体的系统调用服务例程路径:系统调用号--系统调用表sys_call_table--软中断指令INT 0x80--系统调用号放入 eax 寄存器--system_call函数可以读取eax寄存器获取,然后将其乘以4,生成偏移地址,然后以sys_call_table为基址,基址加上偏移地址--就到了系统调用服务例程了。
对于新进程,操作系统通过复制父进程来创建一个新进程,通过调用do_fork来实现----每个新创建的进程动态地分配一个
task_struct
结构
对于linux如何装载和启动的多半都是这样的步骤:先处理文件必要提前操作---通过GCC工具弄成cpu可以看懂与执行的文件格式---可以通过execve API启动一个新进--呼叫sys_execve系统调用,负责将新的程序代码和数据替换到新的进程中,打开可执行文件,载入依赖的库文件,申请新的内存空间---执行start_thread---完成新进程的代码和数据替换---返回---执行新的进程代码。
对于理解进程调度时机跟踪分析进程调度与进程切换的过程,一般可以归纳为以下几点:用户需求的进程执行态--故意或者系统中断--SAVE_ALL --调用schedule()--执行到switch_to进程上下文切换--另一个进程进入并进行--restore_all --iret--继续运行用户态进程
总结:
通过本学期的不断学习,深入了解linux内核系统这原来曾经是不可能的神话现如今也已被收入囊中,只是可惜,其中的一些知识没能很好的在实际中消化并加以运用,没能达到自己想要的自己编译与修改的高度,当然这在短期内很难实现,但在以后的学习与生活中会不断地去完善与学习,进一步提高动手编程能力而不仅仅局限于客观知识的理解,做到融会贯通。这学期通过老师独特的教学方式确实在一定的程度上调动了学生的积极性,在学期开始阶段,由于自身各种原因没能很好地认识到这一点,在学习上无作为地被动学习没能很好地跟上步伐,老师的话确实对,今天落下的,明天就得补回来,知识是靠积累的,生命不息,学习不止,谢谢老师这一学期的教诲,实在受益匪浅。