zoukankan      html  css  js  c++  java
  • Linux内核学习总结

    Linux内核学习总结

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

    对Linux系统的理解及学习Linux内核的心得

    Linux是一个多进程的操作系统,所以,其他的进程必须等到正在运行的进程空闲CPU后才能运行。当正在运行的进程等待其他的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其他正在等待的进程,这就是进程切换。内核中的调度算法决定将CPU分配给哪一个进程。

    Linux系统有一个进程控制表(process table),一个进程就是其中的一项。进程控制表中的每一项都是一个task_struct结构,在task_struct结构中存储各种低级和高级的信息,包括从一些硬件设备的寄存器拷贝到进程的工作目录的链接点。进程控制表既是一个数组,又是一个双向链表,同时又是一个树,其物理实现是一个包括多个指针的静态数组。系统启动后,内核通常作为某一个进程的代表。一个指向task_struct的全局指针变量current用来记录正在运行的进程。

    刚开始,我认为主要的问题在于你知道不知道,而不是理解不理解,某个子系统的实现采用了某种策略、方法,而在学习中需要做的就是知道有这么一回事儿,然后才是理解所描述的策略或者方法。但是经过老师讲解后,才发现理解更重要。

    学完课程后,能在自己的脑海中建立起内核的大体框架,理解各个子系统的设计理念和构建思想,这些理念和思想会从宏观上呈献给你清晰的脉络,就像一个去除了枝枝叶叶的大树的主干,一目了然;当然,肯定还会涉及到具体的实现方法、函数,但是此时接触到的函数或者方法位于内核实现的较高的层次,是主(要)函数,已经了解到这些函数,针对的是哪些设计思想,实现了什么样的功能,达成了什么样的目的。至于该主函数所调用的其它的辅助性函数就等同于枝枝叶叶了,不必太早就去深究。此时,也就初步建立起了内核子系统框架和代码实现之间的关联,关联其实很简单,比如一看到某个函数名字,就想起这个函数是针对哪个子系统的,实现了什么功能。

    Linux内核分析博客链接和知识汇总

    • 学习链接总结

    LINUX内核分析第一周学习总结——计算机是如何工作的

    LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

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

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

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

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

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

    • 学习知识总结

    1.计算机是如何工作的?

    存储程序计算机工作模型

    X86汇编基础

    汇编一个简单的C程序分析其汇编指令执行过程

    2.操作系统是如何工作的?

    函数调用堆栈

    借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断 

    在mykernel基础上构造一个简单的操作系统内核

    3.构造一个简单的Linux系统MenuOS 

    Linux内核源代码简介

    构造一个简单的Linux系统

    跟踪调试Linux内核的启动过程

    4.扒开系统调用的三层皮(上)

    (一)用户态、内核态和中断处理过程

    (二)系统调用概述

    系统调用概述和系统调用的三层皮

    (三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用

    使用库函数API获取系统当前时间

    C代码中嵌入汇编代码的方法(复习)

    使用C代码中嵌入汇编代码触发系统调用获取系统当前时间

    5.扒开应用系统的三层皮(下)

    (一)给MenuOS增加time和time-asm命令

    (二)使用gdb跟踪系统调用内核函数sys_time

    (三)系统调用在内核代码中的工作机制和初始化

      1. 系统调用在内核代码中的工作机制和初始化

      2. 简化后便于理解的system_call伪代码

      3. 简单浏览system_call和iret之间的主要代码

    6.进程的描述和进程的创建

    进程的描述

    1. 进程描述符task_struct数据结构(一)
    2. 进程描述符task_struct数据结构(二)

    进程的创建

    1. 进程的创建概览及fork一个进程的用户态代码
    2. 理解进程创建过程复杂代码的方法
    3. 浏览进程创建过程相关的关键代码
    4. 创建的新进程是从哪里开始执行的?
    5. 使用gdb跟踪创建新进程的过程

    7.可执行程序的装载

    (一)预处理、编译、链接和目标文件的格式

    1.可执行程序是怎么得来的

    2.目标文件的格式ELF 

    3.静态链接的ELF可执行文件和进程的地址空间

    (二)可执行程序、共享库和动态加载

    1.装载可执行程序之前的工作

    2.装载时动态链接和运行时动态链接应用举例

    (三)可执行程序的装载

    1.可执行程序的装载相关关键问题分析

    2.sys_execve的内部处理过程

    3.使用gdb跟踪sys_execve内核函数的处理过程

    4.可执行程序的装载与庄生梦蝶的故事

    5.浅析动态链接的可执行程序的装载

    8.进程的切换和系统的一般执行过程

    (一)进程切换的关键代码switch_to分析

    1.进程进度与进程调度的时机分析

    2.进程上下文切换相关代码分析

    (二)Linux系统的一般执行过程

    1.Linux系统的一般执行过程分析

    2.Linux系统执行过程中的几个特殊情况

    3.内核与舞女

    (三)Linux系统架构和执行过程概览

    1.Linux操作系统架构概览

    2.最简单也是最复杂的操作——执行ls操作

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

    总结部分:学习《Linux内核分析》课程中最大的收获?学习完《Linux内核分析》课程后您最大的遗憾是什么?

          慕课上完了,但是内核学习却才开始。这几周的博客和作业,一直认真地写,对知识多少有些掌握但一直不够清晰。讨论中才知道自己的基础薄弱。课上我们分析的是linux-3.18.6内核源码,其精妙的数据结构和算法简直让人叹为观止。课堂我们也只是查看了部分核心源码,希望在今后我可以学习更多。简单,漂亮的内核,我们没有理由不去学习。 linux内核,主要包括进程管理、内存管理、设备驱动、文件系统,从分析内核了解到整个系统是如何工作的,如何控制管理资源分配,进程切换并执行。各种策略和结构让系统运行时更有效率。只有懂得其中的基本工作机制才能够有效的裁剪内核,再重新编译内核,生成高效、可移植的内核模块。

          最大的收获是让我对内核有了进一步的认识,对于源码能够自己去搜索查看,能通过阅读部分核心源码来验证老师所说的理论。之前的学习就像盲人摸象,不能联系到一起,学的很零碎。通过这次课,就像老师所说的,有时候我们可以先动脑想一下系统是如何操作如何管理的,然后再看源码验证纠正自己的想法,这样的内核学习方式更加有效,毕竟内核源码博大精深,想要研究透彻不是一朝一夕可以做到的。

          总结下我这次课程的学习,我觉得遗憾是还有好多不足,慕课结束了,到现在还没有把所有的知识点串起来,没能很好的形成一条主线,还需要多花时间理一理,能够有更清晰的思路才能更好的学习好内核。    

  • 相关阅读:
    线性表的实现用通用方法实现线性表的初始化、求表长、插入元素、删除元素等
    用c++定义两个坐标点,计算两点间距离;进而计算线段的面积
    Java:学生信息的录入,各种排序,对文件的操作
    数组1 2 3 4 5 6 1(输入-1结束),奇数位的数逆序,偶数位数不变
    按层次遍历二叉树,用队列作为缓冲
    Chapter09"内核模式下的线程同步"之事件内核对象
    Chapter10“I/O设备的同步和异步”之打开和关闭设备
    CSDN博客积分系统
    探秘Java垃圾回收机制
    Chapter09“内核模式下的线程同步”之可等待的计时器内核对象
  • 原文地址:https://www.cnblogs.com/lalacindy/p/5440843.html
Copyright © 2011-2022 走看看