LINUX内核学习总结

LINUX内核学习总结

姓名:李冬辉

学号:20133201

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

 

Linux系统的理解:

Linux系统是一个支持多用户,多线程的优秀的操作系统,功能非常强大和完善,这些功能都是由Linux内核提供的。经过多年的发展,Linux内核被精简优化,已经形成了完备的体系。它向用户提供以下几个方面的功能保障:内存管理,进程调度,文件系统,设备管理,网络管理。本课程中,老师集中精力于一点,主要讲了进程和进程调度这一方面的知识,让我们知道了什么是进程,进程与可执行程序之间的关系,可执行程序如何启动,系统调用怎样进行,进程调度的过程等等。

 

第一周到第八周博客作业目录:

一、分析汇编代码理解计算机是如何工作的

http://www.cnblogs.com/petede/p/5212543.html

二、理解操作系统是如何工作的

http://www.cnblogs.com/petede/p/5244245.html

三、跟踪分析Linux内核的启动过程

http://www.cnblogs.com/petede/p/5267564.html

四、使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

http://www.cnblogs.com/petede/p/5278770.html

五、分析system_call中断处理过程

http://www.cnblogs.com/petede/p/5319027.html

六、分析Linux内核创建一个新进程的过程

http://www.cnblogs.com/petede/p/5345060.html

七、Linux内核如何装载和启动一个可执行程序

http://www.cnblogs.com/petede/p/5351696.html

八、理解进程调度时机跟踪分析进程调度与进程切换的过程

http://www.cnblogs.com/petede/p/5396546.html

 

关于每周作业的总结:

1.  分析汇编代码理解计算机是如何工作的

冯诺依曼体系结构的计算机,又叫存储程序计算机,从硬件的角度来看,其工作模型是CPU依次读取内存中的指令来完成工作。本周以一段汇编代码为例,详细介绍了CPU计算模块、寄存器和内存是如何配合工作的。

 

 2. 理解操作系统是如何工作的

通过本讲的学习和实验,我们知道操作系统的核心功能就是:进程调度和中断机制,通过与硬件的配合实现多任务处理,再加上上层应用软件的支持,最终变成可以使用户可以很容易操作的计算机系统。

     

 3. 跟踪分析Linux内核的启动过程

       start_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。start_kernel就像是c代码中的main函数。不管你关注Linux的内核模块,总是离不开start_kernel函数的,因为大部分模块的初始化工作都是在start_kernel中完成的。按照这节课的实验步骤,我们可以跟踪Linux内核的启动过程。

     

 4. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

       即便是最简单的程序,也难免要用到诸如输入、输出以及退出等操作,而要进行这些操作则需要调用操作系统所提供的服务,也就是系统调用。除非你的程序只完成加减乘除等数学运算,否则将很难避免使用系统调用。在 Linux 平台下有两种方式来使用系统调用:利用封装后的 C 库(libc)或者通过汇编直接调用。本周从示例出发,介绍了系统调用的概念,以及如何使用系统调用。

     

 5. 分析system_call中断处理过程

       通过gdb我们可以给系统调用内核处里程序如sys_write, sys_time设置断点,并让程序停在断点处,进行断点跟踪系统调用处里过程。由于system_call是完全用汇编写就一个的函数,虽然我们也可以在system_call处设置断点,但却无法让系统停在system_call处,所以也无法通过单步跟踪学习其处里流程。但system_call是所有系统调用的入口,也是程序由用户态转入内核态执行时无法越过的一个函数,其重要性不言而喻,所以我们跟随老师简化的汇编代码以及源代码学习其主要的流程。

       

6. 分析Linux内核创建一个新进程的过程       

在Linux应用程序的开发中,可以通过fork、vfork和clone等API来创建一个子进程,它们在Linux内核中对应的系统调用分别为sys_fork、sys_vfork和sys_clone函数,而这些函数最终都会调用do_fork完成子进程的创建。do_fork主要是复制了父进程的task_struct,然后修改必要的信息,从而得到子进程的task_struct。

       

7. Linux内核如何装载和启动一个可执行程序

       Linux系统可以通过execve API启动一个新进程,该API又呼叫sys_execve系统调用,负责将新的程序代码和数据替换到新的进程中,打开可执行 文件,载入依赖的库文件,申请新的内存空间,最后执行 start_thread(regs, elf_entry, bprm->p) ,设置 new_ip, new_sp ,完成新进程的代码和数据替换,然后返回,接下来就是执行新的进程代码了。

       

8. 理解进程调度时机跟踪分析进程调度与进程切换的过程

     最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程

  1. 正在运行的用户态进程X
  2. 发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
  3. SAVE_ALL //保存现场
  4. 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换
  5. 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
  6. restore_all //恢复现场
  7. iret - pop cs:eip/ss:esp/eflags from kernel stack
  8. 继续运行用户态进程Y

 

学习体会:

学习完这个课程之后,加深了我对操作系统理论的理解,知道了Linux系统是如何工作的,看得懂一些简单的内核代码,记住了一些Linux命令行界面的操作指令。在这门课程中,教给我更多的是学习方法,即从何处着手学习Linux内核,课程中给了我们很多这方面的提示,例如:如何调试内核,如何看懂内核中的汇编代码,如何分析系统调用等等。经过几周的学习,个人觉得受益匪浅,希望以后还可以更多的了解LINUX。

 

posted on 2016-04-22 22:28  雷牛克斯  阅读(194)  评论(0编辑  收藏  举报