有关Linux内核分析课程的总结

来源:互联网 发布:21cn企业邮箱域名 编辑:程序博客网 时间:2024/06/06 11:36

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

            历时两个多月的Linux内核课程就要结束了,回顾这一段时间的学习历程,发现在不知不觉中已经学了不少东西,今天趁着这个机会进行一下总结。首先,我了解了什么是Linux系统,Linux系统是一款功能强大的操作系统,Linux是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议 而且它又是一款开源系统,非常适合学习研究,学习Linux系统最重要的是要研究好Linux系统内核,通过学习,我发现,虽然Linux内核文件并不是很大,但是其中Linux内核设计还是非常精巧的,各种文件夹的架构十分的合理,编码方面也是十分的规范,对于我们初入此门的同学来说,是非常好的学习材料,此次课程由于时间有限,没有全部学习,我主要学习了一下几个方面:

       首先我接触了汇编,从汇编的角度去理解了c语言的执行过程,这在以前是有过接触的,但是并没有很深入的理解,通过学习,大致了解了汇编是如何处理c语言程序的,而且初步了解了堆栈的处理过程。接着就学习Linux操作系统对进程的调度,以前也只是知道这个概念,但是没有自己去写过相关代码,此次训练,让我明白了操作系统是如何对进程进行调度的。接着又接触了GDB这个调试跟踪工具,尝试在系统启动方面应用这个工具,也取得了小小进步,知道如何利用这个工具,但是系统启动方面并没有完全掌握。然后又学习系统API,以前这个东西我只知道是可以调用的,甚至不知道它长得什么样子,而此次学习不仅知道长得什么样,还顺带学习了一下它的工作原理,会后期的学习打下了坚实的基础。后面果然我们利用了这个功能,有一个GetPid的系统调用,我们去测试它,甚至根据Linux内核提供的相关信息,我们去改写它,去模仿它的功能进行调用,再加上对GetPid的GDB跟踪,我更加确信了这个系统调用的使用流程。后面,我们又开始接触一个新的概念,那就是新进程,初步理解了什么是进程,进程是如何创建的,进程的创建流程等一系列问题,然后紧接着我又学习了进程的调度,我们自己写程序进行调度,从而实现进程的调度,最后一个课时,我们学习了如何在内核中装载可执行程序,在这节课程中,我详细了解了可执行程序的形成过程,以及如何在里面装载可执行程序。通过一系列的课程学习,算是比较粗略的了解内核有关功能,也简要的了解了内核的一些执行流程,主要是学习到了一些方法如何去研究内核,比如GDB这个十分重要的工具。

       接下来放上我在此次课程中的学习博客。

       1.从汇编角度解析c语言运行过程

        博客地址:点击打开链接

        摘要:人类的思维活动通过相应的高级语言编写成代码,输入到计算机中,计算机根据规则将高级语言代码转化成汇编语言,然后通过取址、译码、运算、输出结果等步骤将人类赋予的任务完成。从人类抽象思维到计算机具体的加减乘除的转化,再将一串二进制数字转化为人类能够理解的符号,即是计算机的意义,这其中的转化流程即是计算机的工作过程。

     2.聊聊Linux操作系统对进程的调度

       博客地址:点击打开链接

       摘要:linux采用一系列调度算法来调度整个系统,这里只是简单的模仿了一下调度,真实情况还需要考虑进程的优先级,进程的执行时间等因素,比这个要复杂很多。而linux正是凭借这样的调度算法来很好的利用计算机本身的资源。操作系统就是通过应用程序的进程id,优先级等信息来实现调度。在调度开始时进行现场保存,包括有关寄存器值得压栈保存等,在调度结束后进行恢复现场,然后继续执行。整个操作系统的运行流程就是这样,一直不断循环,直到关机。

     3.用GDB来检验内核启动流程

      博客地址:点击打开链接

      摘要:Linux启动还是比较复杂的,主要是其中的初始化过程要清楚,里面初始化的中断屏蔽,以及硬件的初始化,第一个进程的启动,以及服务的开启等都是十分复杂的。其中idle是0号进程,注处理器上的idle由原始进程演变而来,从处理器上的idle由init进程fork得到,但是它们的pid都是0,且idle进程为最低优先级,且不参与调度,只是在运行队列为空的时候才被调度。而1号进程则由idle进程fork()而来,是系统中其他所有进程的祖先。

    4. 

谈谈从库函数API和C代码中嵌入汇编两种方式来实现系统调用

     博客地址:点击打开链接

     摘要:总的来说,操作系统为用户态进程与硬件设备进行交互提供了一组接口。系统调用是系统提供的一系列函数,目的主要是为了保护系统的安全。Linux内核是系统最为复杂的地方,当一般程序员对其进行操作的时候是没有权限执行内核态任务,主要是怕一般程序员学的不是很好,破坏了系统。如果一般程序员想要操作内核态的某些功能怎么办呢?这个时候就要用到我们的系统调用,你只需要说出你的需求,系统去帮你实现,而用户不需要关心实现细节。加上理解系统调用的流程,我想系统调用你应该就掌握的差不多了。

    5. 

用GDB跟踪调试getpid系统调用函数

      博客地址:点击打开链接

      摘要:系统调用是一种特殊的中断,首先需要有一个中断请求,保存好现场后,然后将系统调用号和中断信号一起传递进来,然后根据系统调用号在系统调用表中寻找相应的系统调用执行函数,然后根据系统执行函数去找到函数执行的实体,然后就可以执行相应的系统调用操作,操作完了以后返回,然后就iret回到主进程中,然后恢复中断现场,然后继续执行。

     6.   

聊聊Linux内核创建新进程

        博客地址:点击打开链接

        摘要:fork创建子进程也是一种特殊的系统调用,在执行这个系统调用之前,要进行保护现场操作,也就是要对有关寄存器的值进行存储,当新进程创建完成以后可以回到此处继续执行。在保护好现场以后,就是查找sys_call_table里面的有关信息,这样就能根据调用号来找到相应的入口地址。再通过函数入口地址来进行处理,处理过程也是拷贝父进程的有关信息,然后加上自己独特的信息,这就构成新的进程,这也是fork的整个工作流程。


  7. 

Linux内核装载和启动一个可执行程序

       博客地址:点击打开链接

    摘要:总的来说,exec本质就是个替换进程代码段的过程,这里面的难点在于elf文件格式的解析,以及新的代码段堆栈信息和寄存器上下文的设定,上面已经清楚的解释elf文件,对于堆栈变化部分,感兴趣的读者可以自己去查阅相关资料

    8. 

Linux中进程调度与切换过程

        博客地址:点击打开链接

        摘要:Linux系统的进程切换的一般执行过程是这样的,从进程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 tokernel 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内核分析》课程中最大的收获是学习了GDB的使用方法,然后知道Linux的基本构成和功能;最大的遗憾是时间比较紧张,

每次只能完成老师给定的规定任务,无法进行深入理解和研究Linux系统。

0 0