陈民禾,原创作品转载请注明出处《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./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端口,则可以使用-gdb tcp:xxxx来取代-s选项

另开一个shell窗口

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

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

四.收获与遗憾

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

Linux课程学习之我思的更多相关文章

  1. Linux课程学习 第四课

    学习必须如蜜蜂一样,采过许多花,这才能酿出蜜来 这月事比较多,每课的笔记都会慢慢补回来的,做事得有始有终 在网络上,人们越来越倾向于传输压缩格式的文件,原因是压缩文件体积小,在网速相同的情况下,传输时 ...

  2. Linux课程学习 第三课

    生活中的许多事,并不是我们不能做到,而是我们不相信能够做到 https://www.linuxcool.com/ 一个很实用的Linux命令查询网站,并且还有发音 如果我们在系统终端中执行一个命令后想 ...

  3. Linux课程学习 第二课

    工欲善其事,必先利其器 虚拟机安装(链接中有详细的操作方法,这里就不再详细说明了,但有注意事项,会在下文中截图标注) https://www.linuxprobe.com/  注:为了避免是权限问题导 ...

  4. Linux网络课程学习第一天

    第一天上课主要介绍了LINUX系统和Linux课程的情况.了解了开源系统的四大优势,六大特点. 最具有心得的一句话: 学习是件苦差事: 稻盛和夫先生的话也深深激励着我:“工作马马虎虎,只想在兴趣和游戏 ...

  5. 14门Linux课程,打通你Linux的任督二脉!

    Linux有很多优点:安全.自主.开源--,也正是这些优点使得很多人都在学Linux. 虽说网上有大把的Linux课程资源,但是对很多小白来说网上的课程资源比较零散并不适合新手学习. 正因为此,总结了 ...

  6. 别出心裁的Linux命令学习法

    别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...

  7. 别出心裁的Linux系统调用学习法

    别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...

  8. Linux驱动学习步骤(转载)

    1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ls ...

  9. Linux 第一次学习笔记

    一.Linux 为何物 Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有 ...

随机推荐

  1. POJ 1080( LCS变形)

    题目链接: http://poj.org/problem?id=1080 Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K ...

  2. MySQL数据库 utf-8与utf8mb4

              MySQL的“utf8”实际上不是真正的UTF-8.          MySQL中的“utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节. MySQL ...

  3. 早上出现的zabbix启动错误

    之前根据教程安装好zabbix,MySQL的版本是5.1. 昨天无聊想升级成5.6.不过升级比较麻烦.我就直接把5.1删了再装5.6. 安装中途zabbix挂了一次.把5.6装上启动后就好了. 早上z ...

  4. FPGA-Xilinx原语调用之ODDR

    记录背景:最近由于想实现GMIItoRGMII的功能,因此需要调用ODDR原语. ODDR:Dedicated Dual Data Rate (DDR) Output Register 通过ODDR把 ...

  5. Oracle保存带&的数据

    在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符号,SQL*Plus就会要你输入替代值.这就意味着你无法将一个含有该符号的字符串输入数据库或赋给 ...

  6. SpringCloud-声明式Rest调用Feign(四)

    前言:一般情况下我们通常使用RestTemplate来实现声明式远程调用,但是当参数过多,那么效率就会变得很低,并且难以维护,所以在微服务当中也有声明式Rest调用的组件Feign 一.Feign简介 ...

  7. caffe windows编译

    MicroSoft维护的caffe已经作为官方的caffe分支了,编译方式也改了,刚好最近重装了一次caffe windows, 记录一下里面的坑 https://github.com/BVLC/ca ...

  8. 【CJOJ2433】陌上花开 CDQ分治

    [CJOJ2433]陌上花开 CDQ呲嘚秋分治 WA果然呲嘚秋分治跑得比树套树还快!!!(md理论复杂度不是一样的吗) 但树套树不知道比呲嘚秋高到哪里去辣装X用 Orz hzwer 第一维sort,第 ...

  9. 一款好看的Sublime Text浅色主题:Ayu大作

    上一篇分享的VS Code的文中,界面也是浅色主题,也是Ayu作品.下面看一下Sublime Text中的Ayu浅色主题 不错吧. 如何下载? 首选项——插件控制——安装插件或者ctrl+shift+ ...

  10. UWP 轨道视图Orbit View

    先看一下效果吧 这是我的Music Tags App里面的效果图,当然你也可以做的比我的更炫. 其实这个效果的实现来自于控件UWP Community Toolkit的OrbitView,所以大家要多 ...