码迷,mamicode.com
首页 > 系统相关 > 详细

linux学习总结

时间:2016-05-01 23:06:38      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

linux学习总结

                                                 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

四、总结

  说实话,不是恭维,这门课的遗憾在于时间太短,好多东西没能继续学下去,如果孟老师能接着讲下去就好了,真的能学到很多东西。有些东西学的并不只是一门学科,更重要的是老师的思路,知识如果只是学到,而不能融会贯通,我觉得和没有学过差别不大,提纲挈领比硬塞知识,真的好的多太多,只有逻辑搞清楚,主线弄明白,脑子里的条理才会清晰,这样才能说真的我学了这门课。

    虽然这门课在网易云上学完了,但我的课程还没有结束,感谢孟老师把我领进门,带我走过最开始的懵懂阶段,接下来我会自己认真的走下去。多谢孟老师,辛苦了。

linux学习总结

标签:

原文地址:http://www.cnblogs.com/haiye/p/5451352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!