陈民禾,原创作品转载请注明出处《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跟踪调试内核
.qemu -kernel linux-3.18./arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
.# -S freeze CPU at startup (use ’c’ to start execution)
.# -s shorthand for -gdb tcp:: 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

另开一个shell窗口

.gdb
.(gdb)file linux-3.18./vmlinux # 在gdb界面中targe remote之前加载符号表
.(gdb)target remote: # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
.(gdb)break 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. 使用CBrother做TCP服务器与C++客户端通信

    使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之 ...

  2. 20155237 2016-2017-2 《Java程序设计》第2周学习总结

    教材学习内容总结 通过教材了解了JAVA可区分为基本类型和类类型(参考类型)两大类型系统. 基本类型 分类 整数 short(2) / int(4) / long(8) 字节 byte(-128-12 ...

  3. Oracle下各个NLS相关参数取得方法

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  4. PyQt5用QTimer编写电子时钟

    [说明] 本文用 PyQt5 的QTimer类的两种方式实现电子时钟 [效果图] [知识点] QTimer类提供了定时器信号/槽和单触发定时器. 它在内部使用定时器事件来提供更通用的定时器. QTim ...

  5. 【转载】COM 组件设计与应用(七)——编译、注册、调用

    原文:http://vckbase.com/index.php/wv/1218.html 一.前言 上两回中,咱们用 ATL 写了第一个 COM 组件程序,这回中,主要介绍编译.册和调用方法.示例程序 ...

  6. 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...

  7. zhengruioi 470 区间

    区间 链接 题意:给定n个区间[li,ri].你可以选出任意一些区间,设选出的区间个数是s,[l,r]是这些区间的交,求min(s,r-l+1)的最大值. N≤3×105 分析:首先按照左端点排序,然 ...

  8. LUOGU3278 [SCOI2013]多项式的运算

    一次AC.吼啊. BZOJ权限QAQ 区间加和乘打标记,区间乘x就是区间移动,平衡树解决即可. 查询直接遍历一遍然后算出来 // It is made by XZZ #include<cstdi ...

  9. [BZOJ4028][HAOI2015]公约数数列[分块+分析暴力]

    题意 题目链接 分析 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系! 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \( ...

  10. Model详解

    一.数据库操作 Model操作: 创建数据库表结构(建表) 操作数据库表(增删改查) 做一部分的验证(验证) a.建表 1.表字段 AutoField(Field) - int自增列,必须填入参数 p ...