陈民禾,原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000,我的博客中有一部分是出自MOOC课程中视频,再加上一些我自己的理解。 

经过八周的学习,Linux课程告一段落,在这里,对之前的学习做一个汇总,也简单说一下自己的收获与遗憾。

一.博客笔记汇总

这里每个单独的部分不再赘述,可以点击博客进行查看:

第一周笔记    标题:计算机是这样工作的                              

链接:http://www.cnblogs.com/20135124freedom/p/5224847.html

第二周笔记    标题:操作系统的运行机制                              

链接:http://www.cnblogs.com/20135124freedom/p/5248375.html

第三周笔记    标题:Linux系统的启动过程                            

 链接:http://www.cnblogs.com/20135124freedom/p/5273033.html

第四周笔记    标题: 系统调用过程                                       

链接:http://www.cnblogs.com/20135124freedom/p/5299094.html

第五周笔记    标题:system_call中断处理过程                  

链接:http://www.cnblogs.com/20135124freedom/p/5326346.html

第六周笔记    标题:进程的创建与描述                      

链接:http://www.cnblogs.com/20135124freedom/p/5336851.html

第七周笔记    标题:内核如何装载和启动一个可执行程序     

链接:http://www.cnblogs.com/20135124freedom/p/5363662.html

第八周笔记  标题:进程的切换和一般执行过程                        

链接:http://www.cnblogs.com/20135124freedom/p/5391170.html

二.课本书籍笔记汇总(课本的名称是《LINUX内核设计与实现》

第一章:Linux内核简介     

链接:http://www.cnblogs.com/20135124freedom/p/5281446.html

第二章:从内核出发          

链接:http://www.cnblogs.com/20135124freedom/p/5281446.html

第三章:进程管理             

链接:http://www.cnblogs.com/20135124freedom/p/5343184.html

第四章:进程调度              

链接:http://www.cnblogs.com/20135124freedom/p/5401171.html

第五章:系统调用             

链接:http://www.cnblogs.com/20135124freedom/p/5327908.html

第七章:链接                   

链接:http://www.cnblogs.com/20135124freedom/p/5361838.html

三.对Linux学习内容的汇总想法

知识篇

     我觉得学习Linux内核分析之后应该对Linux有了一个系统性的认识。这门课是针对Linux内核的书籍,学习了之后就会对Linux的运行机制有了一个更深刻的理解,其实Linux和windows还是有很大不同的,也有一些想通的部分,我们这门课采用了一个循序渐进的方式。

 

 

    几个课程中到的比喻,这几个比喻还是比较形象的,串联起来也可以总结一下我们这门课的学习,如下:

  在现代计算机中程序和数据都存储在计算机当中,计算机有它自己的语言,就是汇编语言,它是一门更贴近于机器的语言。
     我理解的计算机进行工作时,总线连接cpu和内存,cpu内有许多的寄存器,他们分工不同,大小也不同,cpu其中有个很重要的寄存器,就是ip寄存器,ip寄存器不断向下递增,指令被不断地执行。计算机通过一定的语句来控制这些组件,实现计算机要完成的工作,就拿这个实验,将c语言编译成机器更容易理解的汇编语言。使用汇编语言,指令被不断地执行,反映在栈中,就是堆栈里面不断发生改变,计算机这样完成了自己的工作。
       我理解中这三大法宝是缺一不可,共同配合之后完成的工作。尤其是中断,上一次课的时候没有讲到中断,其实中断也很重要。有了中断以后在系统里面可以同时跑好几个程序,每个程序有自己的执行流,在这个执行流的过程中,可以切换过去完成另外一项任务,这时候cpu就会做一件事情,由cpu和内核代码共同实现了保存现场和恢复现场。cpu把当前的esp、ebp都压到一个叫做内核堆栈的另外一个堆栈里面去,压到这个堆栈里面去之后呢,然后把eip指向一个中断处理程序的入口,保存现场,执行中断处理程序,我们这个中断处理程序模拟了这个时钟中断,这是是周期性的,每过一段时间发生一个时钟中断,这个时钟中断也会调用一个程序,我们的实验可以很明显看到当前系统里只有一个进程,一直在那里执行,执行过程中每隔一段时间,时钟中断发生一次,这样就模拟了一个最基本的系统环境,在这个系统环境中我们就可以写一个最简单的时间片轮转的一个非常小的,代码少的一个操作系统内核。这就是我理解的操作系统的工作过程。

 

       内核的启动过程可以简单地这么来看:start_kernel从内核一启动的时候它会一直存在,这个就是0号进程,idle就是一个while0,一直在循环着,当系统没有进程需要执行的时候就调度到idle进程,我们在windows系统上会经常见到,叫做system idle,这是一个一直会存在的0号进程,然后呢就是0号进程创建了1号进程,这个init_process是我们的1号进程也就是第一个用户态进程,也就是它默认的就是根目录下的程序,也就是常会找默认路径下的程序来作为1号进程,1号进程接下来还创建了kthreadd来管理内核的一些线程,这样整个程序就启动起来了。也就是所谓的道生一,一生二,二生三,三生万物。

    我们把原来的可执行程序,也就是share可执行程序,int 0x80进入到这个execve的系统调用入睡,当他入睡的时候加载到一个新的可执行程序,加载到新的可执行程序,return 返回之后,也就是它醒来了,蝴蝶执行了在蝴蝶内部的程序,它如果加载庄子,这两者总是想相对的,但都是同一进程,只是把进程里面的可执行程给替换掉了。

按照网课的总结

任何计算机系统都包含一个基本的程序集合,称为操作系统
-内核(进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网络部分)
-其它程序(例如函数库,shell程序、系统程序等等)
操作系统的目的
-与硬件交互,管理所有的硬件资源
-为用户程序(应用程序)提供一个良好的执行环境
那么我们可以看一张图:最底层有磁盘管理,物理内存的管理,内存控制器还有控制台,这个地方它有一个Kernel Intelface to the hardware,
也就是对硬件资源的管理,然后呢在上一层就是内核的实现,内核的实现也就是CPU调度,内存管理,按需调度,虚拟内存等等,还有其他的驱动,磁盘管理,文件系统等等,这些操作系统的内核,我们这门课分析的内核只是计算机操作系统里面最最关键的一些代码,实际上整个操作系统非常复杂,很多其他的部分都没有涉及。那么呢,这个地方有一个系统调用接口,这里涉及到不同的部分,基础软件也就是share共享库lib ,动态加载器这些等等。

从CPU和内存的角度来看Linux系统的执行

1.从在CPU执行指令的角度看

   

2.从内存的角度看

     我理解的计算机进行工作时,总线连接cpu和内存,cpu内有许多的寄存器,他们分工不同,大小也不同,cpu其中有个很重要的寄存器,就是ip寄存器,ip寄存器不断向下递增,指令被不断地执行。计算机通过一定的语句来控制这些组件,实现计算机要完成的工作,就拿这个实验,将c语言编译成机器更容易理解的汇编语言。使用汇编语言,指令被不断地执行,反映在栈中,就是堆栈里面不断发生改变,计算机这样完成了自己的工作。
     
计算机中进程的创建与描述:
    
系统调用
   
     技能篇
      1.LINUX系统及应用程序的安装
      2.命令qemu -kernel 内核可执行文件 -initrd rootfs.img:在内核代码目录下有init,这是一个可执行文件,内含有C语言文件。
     3.编译内核的目的是什么?为了生成符号表(即名称与地址的映射表)。
     4.C代码中嵌入汇编代码,在嵌入的过程中我们可以看到嵌入的过程大致像下面一样:
      _asm_(
          汇编语句模块:
          输出部分:函数调用时候的参数
          输入部分:函数调用时候的参数
          破坏描述部分):
          即格式为asm("statements":output_regs:input_regs:clobbered_regs);
          可以看成是一个函数,有时候可以加一个_volatile_来选择让编译器优化或者不让编译器优化。
      5.设置断点进行调试基本过程
      使用gdb跟踪调试内核
1.qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
2.# -S freeze CPU at startup (use ’c’ to start execution)
3.# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

      另开一个shell窗口

1.gdb
2.(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
3.(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
4.(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

      之后按n执行下去,就这样完成了对内核的调试

四.收获与遗憾

     下面就是我的一些感受,与大家分享一下,也希望朋友们多多指教。
      收获篇:1.原来掌握的知识大多是基于Windows方面的,现在掌握了一些关于Linux方面的知识也可以掌握,这是一个大大的进步。2.了解了一些操作系统的运行机制,这是我原来比较匮乏的地方。3.掌握了一些实际的操作技能,在这门网课中开设了实验楼的相关内容,动手能力得到增强,自己也在实验的过程中发现了许多的乐趣。
      遗憾篇:可能是我的理解能力和动手能力有点弱,我在这门课的学习过程中还是有一些遗憾1.时间比较仓促,许多知识来不及反思总结 2.有些知识感觉自己学的很模糊,比如对于堆栈的具体过程还是搞不清楚,对着视频看能看懂,到了自己操作的时候就总是有一些差距 3.在LINUX方面的实践自己做的还不够丰富。
      以上就是我的学习感受,总之,这门课还是很值得我们学习的,对Linux有兴趣的同学请不要错过哦,这里面有很多让你更加了解Linux原理和运行机制的信息。
 
 

 

 

 

posted on 2016-04-28 22:51  20135124  阅读(218)  评论(0编辑  收藏  举报