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

一、课程总结

1. 课程学习概述

  • 计算机的工作方式:理解Linux的切入点。
  • Linux的整体理解:操作系统的启动、系统功能调用、堆栈变化、进程的创建、可执行程序加载和切换。
  • 调试分析:通过gdb调试内核和分析这些内核代码的基本方法。

2. 学习博客汇总

(1)LINUX内核分析第一周学习总结:计算机是如何工作的?

关于课程的一些预备知识。主要包括汇编语言基础知识、C语言函数调用过程中的堆栈变化和参数传递过程。
  • 复杂又简单的计算机:计算机实现很复杂的功能,计算和处理大量的数据,实际上是通过不断地重复大量既定的简单的操作。
  • 程序:告诉计算机操作的步骤、输入的数据、如何存放处理后的结果。计算机会尽可能忠实地按照程序的顺序将每一个操作步骤的指令取出,变成机器语言,通过软硬件协同工作。
  • 汇编语言:汇编语言是机器语言的一种翻译。现在编译器功能强大,汇编语言真正用的时候并不多,但能够看懂汇编语句,在分析程序真正执行的流程、单步调试程序的方面都有很大帮助。

(2)LINUX内核分析第二周学习总结:操作系统是如何工作的?

简单模拟内核代码。主要包括函数调用堆栈、函数堆栈框架、内核的初始化、中断、进程上下文切换过程的简述以及基于时间片轮转的多道程序模拟。	

- 操作系统三个法宝:存储程序计算机、函数调用堆栈、中断机制。
- 操作系统两把宝剑:中断上下文、进程上下文的切换
  • 操作系统核心功能:进程调度和中断机制,通过与硬件的配合实现多任务处理,再加上上层应用软件的支持,最终变成可以使用户可以很容易操作的计算机系统。
  • 多进程的Linux操作系统:进程必须等到正在运行的进程空闲CPU后才能运行。
  • 进程切换:当正在运行的进程等待其他的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其他正在等待的进程。进程切换机制中包含esp的切换、堆栈的切换。

(3)LINUX内核分析第三周学习总结:构造一个简单的LINUX系统MENUOS

阅读内核源码和构造Linux系统MenuOS。主要包括源码主要结构、内核启动及调试方法和start_kernel的解读。
  • 计算机的启动过程概述:

  • 道生一(start_kernel-->cpu_idle),一生二(kernel_initkthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先):

(4)LINUX内核分析第四周学习总结:扒开系统调用的三层皮(上)

关于系统调用的知识。主要包括对系统调用与用户态、内核态的理解、通过编写汇编代码了解系统调用机制。
  • 系统调用:即便是最简单的程序,在进行输入输出等操作时也会需要调用操作系统所提供的服务,也就是系统调用。Linux下的系统调用是通过中断(int 0x80)来实现的。
  • 传递参数:在执行int 80指令时,寄存器 eax 中存放的是系统调用的功能号,而传给系统调用的参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi 中,当系统调用完成之后,返回值可以在寄存器 eax 中获得。Linux 采用的是 C 语言的调用模式,这就意味着所有参数必须以相反的顺序进栈,即最后一个参数先入栈,而第一个参数则最后入栈。

(5)LINUX内核分析第五周学习总结:扒开系统调用的三层皮(下)

添加一个自己编写的系统调用,加深对系统调用在内核代码中的处理过程的理解。
  • 系统调用就是特殊的一种中断。
  • 第一步,SAVE_ALL保存现场。
  • 第二步,确定中断信息,将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。
  • 第三步,处理中断。
  • 第四步,RESTORE_ALL恢复系统调用时的现场,iret返回用户态。

(6)LINUX内核分析第六周学习总结:进程的描述和进程的创建

关于进程的描述和创建。主要包括PCB的组织形式、进程的数据结构进程描述符、fork系统调用的关键执行过程。
  • 从系统调用的角度理解fork():一次调用两次返回(fork系统调用在父进程和子进程各返回一次,子进程中返回的是0,父进程中返回值是子进程的pid)

  • fork一个子进程的主要执行过程:

  • Linux通过复制父进程来创建一个新进程,通过调用do_fork来实现并为每个新创建的进程动态地分配一个task_struct结构。

  • 执行起点与内核堆栈保证一致:设置子进程的ip之前:*childregs = *current_pt_regs();将父进程的regs参数赋值到子进程的内核堆栈,其中存放了SAVE_ALL中压入栈的参数。

  • 新进程的开始:copy_thread()中:p->thread.ip = (unsigned long) ret _from _fork;将子进程的 eip 设置为ret_from _fork的首地址,子进程从ret_from_fork开始执行的。

(7)LINUX内核分析第七周学习总结:可执行程序的装载

关于程序的加载过程和ELF文件格式。主要包括得到一个可执行程序过程、ELF文件格式的结构和静态链接、可执行程序的静态加载过程和动态加载过程。
  • execve执行的时候陷入到内核态,用execve中加载的程序把当前正在执行的程序覆盖掉,当系统调用返回的时候也就返回到新的可执行程序起点:

  • execve装载一个可执行程序的主要执行过程:

(8)LINUX内核分析第八周学习总结:进程的切换和系统的一般执行过程

关于进程切换和整体执行过程。主要包括Linux进程调度算法简介、进程切换代码分析、switch_to理解、进程相关的数据结构简析。
  • 进程调度算法:根据分类不同,调度的设计原则也不同。
  • 进程的切换:切换地址空间、切换内核堆栈、切换内核控制流程和一些必要的寄存器保存和恢复。
  • 调度时机:内核线程可以直接调用schedule()进行进程切换(主动),也可以在中断处理过程中进行调度(被动)。用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
  • 内核的使用:32位x86系统下,每个进程的地址空间有4G,用户态0-3G,3G以上仅内核态可以访问。所有进程3G以上是共享的,在内核中代码段,堆栈段都是相同的,回到用户态才不同。进程进入内核就都一样,没有进程陷入内核就执行0号进程。内核可以看作各种中断处理过程和内核线程的集合。

二、学习感想

1. 收获

  • 系统的了解了操作系统内核的相关结构和设计原理,学会了gdb调试与分析内核代码的方法。
  • 在每周博客互评中,我会发现一些很好的博客,别人不同的总结思路给我很大的启发,更全面的理解这一周的内容,并通过在学习中不断思考和总结把握新知识的脉络。
  • 很开心的一点是有非常认真看我的博客的评价者帮助解答了我实验中的问题,当时看到的时候真的非常感动!

2. 遗憾

  • 感觉这八周的学习并没有达到我开始预想的程度。实际上,很多问题都是不求甚解的状态。只能达到把内容基本连贯的串下来的水平,对有一些代码的阅读,尤其是相对应堆栈变化的理解还是比较模糊。
  • 提一个小小的意见:孟老师讲的内容虽然整体思路很明确,但是因为中途知识的扩展让我学起来还是感觉有些零散,本来那些代码调来调去就看得有点迷,再穿插另外的东西一会儿晕了。我觉得可以把主要过程和相关知识讲解明确的分成两部分讲解。

LINUX内核分析期末总结的更多相关文章

  1. Linux内核分析 期末总结

    Linux内核分析 期末总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 ...

  2. Linux内核分析——期末总结

    Linux内核学习总结 首先非常感谢网易云课堂这个平台,让我能够在课下学习,课上加强,体会翻转课堂的乐趣.孟宁老师的课程循序渐进,虽然偶尔我学习地不是很透彻,但能够在后续的课程中进一步巩固学习,更加深 ...

  3. 网易云课堂-----Linux内核分析-----期末主观题

    姚歌 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 下面是对8个课题的 ...

  4. 《Linux内核分析》期末总结

    Linux内核设计期中总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 前八周博客汇总及总结 Linux内核设计第一周——从汇编语言出发理解计算机工作原理 我们学习了汇编语言的基础知识,这一 ...

  5. 期末总结:LINUX内核分析与设计期末总结

    朱国庆原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一,心得体会 关于网上听课这 ...

  6. 《Linux内核分析》期末总结及学习心得

    [洪韶武 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ] 一.学习心得 本学 ...

  7. 期末总结20135320赵瀚青LINUX内核分析与设计期末总结

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 对LINUX内核分析与设计这 ...

  8. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  9. Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序

            1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...

随机推荐

  1. 【 D3.js 入门系列 --- 5 】 如何添加坐标轴

    第3节中做了一个图标,但没有为它添加一个相应的坐标轴,这样不知道每一个柱形到底有多长.这一节做一个坐标轴. D3中的坐标轴都是以 svg 图的形式出现的,这也是为什么在第3节中要使用 svg 的方法做 ...

  2. 【 D3.js 入门系列 --- 2.1 】 关于如何选择,插入,删除元素

    在D3.js中,选择元素的函数有两个:select 和 selectAll . 先说明一下它们的区别: select 是选择所有指定元素的第一个 selectAll 是选择指定元素的全部(以用于后面同 ...

  3. codeforces298c

    link:http://codeforces.com/problemset/problem/298/C 这道题目可以看出来我智商确实拙计 #include <iostream> #incl ...

  4. ✡ leetcode 163. Missing Ranges 找出缺失范围 --------- java

    Given a sorted integer array where the range of elements are in the inclusive range [lower, upper], ...

  5. poj3592 强连通+记忆化搜索

    题意:有一片 n*m 的矿地,每一格有矿.或这传送门.或者挡路岩石.除了岩石不能走以外,其他的格子都能够向右或向下走,走到一个非岩石的格子.对于每一个矿点,经过它就能得到它的所有矿石,而对于每一个传送 ...

  6. TortoiseGit 添加ssh key

    TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥.使用命令ssh-keygen -C "邮箱地址" -t rsa产生的密钥在Tortoi ...

  7. [原创]cocos2d-x研习录-第二阶 概念类之摄相机类(CCCamera)

    在Cocos2D-x中,每个CCNode都拥有一个摄像机类CCCamera.只有通过CCCamera,CCNode才会被渲染出来.当CCNode发生缩放.旋转和位置变化时,都需要覆盖CCCamera, ...

  8. linux 给文件夹权限

    用的thinkphp3.2的框架,在本地运行没有问题,部署到服务器上(基于centos的LAMP环境)即报错_STORAGE_WRITE_ERROR_:./Application/Runtime/Ca ...

  9. unity, 由scriptableObject创建.asset

    由继承自scriptableObject的类X创建.asset文件. 假设类X的定义为: [System.Serializable] public class X : ScriptableObject ...

  10. git秘钥配置--转

    git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以要使用远程的git则需要ssh的配置.github的ssh配置如下:一 .设置git的user name和email:$ git con ...