Linux 内核(Kernel)组成分析

【好文推荐】

 需要多久才能看完linux内核源码?

浅析linux内核网络协议栈--linux bridge

深入理解SR-IOV和IO虚拟化

一文了解Linux上TCP的几个内核参数调优

概述Linux内核驱动之GPIO子系统API接口

一、Linux内核简介

Linux 内核采用宏内核架构,即 Linux 大部分功能都会在内核中实现,如进程管理、内存管理、设备管理、文件管理以及网络管理等功能,它们是运行在内核空间中(也可以称之为特权模式下运行)。

微内核,它仅仅是将内核的基本功能放入内核中,如进程管理、进程调度等,而其他的设备管理、文件管理等功能都放在内核空间之外(即运行在非特权模式下)。

Linux 内核组成 :

Linux 内核主要由 5 部分组成,分别为:进程管理子系统,内存管理子系统,文件子系统,网络子系统,设备子系统。

由系统调用层(系统调用子系统)进行统一管理,应用层通过系统调用层的函数接口与内核进行交互,用户应用程序执行的

地方是用户空间,用户空间之下则是内核空间,Linux 内核正是位于内核空间中。

Linux 内核(Kernel)组成分析_第1张图片

二、Linux内核组成

1、进程管理子系统

进程管理的核心就是进程的调度。在 Linux 内核中,进程调度的单元是进程,进程调度控制系统中的多个进程对 CPU 的访问,从宏观上看,系统中的进程在 CPU 中是并发执行的。此外内核通过系统调用提供了应用程序编程接口,例如:创建新进程(fork,exec),结束进程(kill,exit),并且提供了控制进程,同步进程和进程间通信的接口。

(1)进程与程序的区别:

  • 程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体。
  • 进程:是一个执行中的程序,它是动态的实体。

(2)进程的四要素:

  • 有一段程序供其执行,这段程序不一定是某个进程所专有,可以与其他进程共用。
  • 有进程专有的系统堆栈空间(也可以称之为内核堆栈空间)。
  • 在内核中有一个 task_struct 数据结构,即进程控制块。有了这个数据结构,进程才能被内核调度器识别并参与内核调度,除此之外它还记录着进程所占有的各项资源。
  • 除上述的专有的系统堆栈空间外,进程还需要有独立的用户堆栈空间,这就是 mm_struct 数据结构,该数据结构位于 task_struct 结构中,字段名称为 mm。

(3)进程的堆栈:

  • 内核在创建一个新的进程(创建进程控制块 task_struct) 时,为进程创建堆栈。
  • 一个进程有 2 个堆栈,即用户堆栈和系统堆栈;用户堆栈的空间指向用户地址空间,内核堆栈的空间指向内核地址空间。
  • 当进程在用户态运行时,CPU 堆栈指针寄存器指向用户堆栈地址,使用用户堆栈。
  • 当进程运行在内核态时,CPU 堆栈指针寄存器指向的是内核堆栈空间地址,使用内核堆栈。

(4)进程与线程的区分:

  • 进程:四个要素是必要条件
  • 用户线程:有共享的用户空间
  • 内核线程:没有用户空间,即 mm_struct 为 NULL
  • 简单区分如图所示:

Linux 内核(Kernel)组成分析_第2张图片

(5)进程调度:

进程调度是进程管理子系统中最重要的一个功能,是一个管理进程之间使用 CPU 资源的管理程序。

进程调度器有效地为各个进程分配其使用的 CPU 资源时间,同时又要达到良好的用户体验效果,此外调度器还需要解决一些互相冲突的情况,例如既要实现实时任务的最小化响应时间, 又要最大限度地提高 CPU的总体利用率等。

在 Linux2.6 版本之后,进程调度器使用新的进程调度算法——Completely Fair Scheduler,简称 CFS,即完全公平调度算法。该算法会按所需分配的计算能力,向系统中每个进程提供最大的公正性,它负责将 CPU 资源,分配给正在执行的进程,目标在于最大化程式互动效能,最小化整体 CPU 的运用,这个算法使用红黑树来实现,算法效率为 O(log(n))。

(6)进程状态:

Linux 内核(Kernel)组成分析_第3张图片

Linux 内核(Kernel)组成分析_第4张图片

2、内存管理子系统

  • 主要作用是保证系统安全访问内存区域,且绝大部分 CPU 都是支持内存管理单元的(Memory Management Unit,MMU)
  • 内存管理子系统负责管理每个进程完成从虚拟内存到物理内存的转换,以及系统可用内存空间。
  • 内存管理的硬件按照分页方式管理内存,分页就是把系统的物理内存按照相同大小等分,每个内存分片称作内存页,通常内存页大小是 4KB。内存管理子系统要管理的不仅是 4KB 缓冲区,它提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配管理结构,并跟踪内存页使用情况。系统就支持动态调整内存使用情况。
  • Linux 还支持内存交换,因为 Linux 中使用的是虚拟内存,当物理内存不足时,内存管理子系统会将内存暂时移到磁盘中,在物理内存充裕时又将内存页从磁盘移到物理内存中。
  • 在 32 位的系统上,每个进程都最大享有 4GB 的内存空间,因为由于 32 位的系统寻址空间只有4G,当然这是虚拟内存,0~3GB 是属于用户内存空间,3~4GB 是属于系统内存空间,实际上用户的程序几乎使用不完那么大的用户空间,一旦超出将无法正常运行,当然系统内存空间与用户内存空间是可以调整的。

3、文件管理子系统

  • 在 Linux 系统中一切皆文件,它把一切资源都看作是文件,包括硬件设备,通常称为设备文件。
  • Linux 的文件管理子系统主要实现了虚拟文件系统(Virtual File System,VFS),虚拟文件系统屏蔽了各种硬件上的差异以及具体实现的细节,为所有的硬件设备提供统一的接口,即实现了设备无关性,同时文件管理系统还为应用层提供统一的 API 接口。
  • Linux 的文件系统体系结构是对一个对复杂系统进行了抽象化,通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持多种文件系统,如 NTFS、EXT2、EXT3、EXT4 、FAT 等等;而用户空间包含一些应用程序和 GNU C 库(glibc),它们使用的 API 接口是由系统调用层提供(如打开、读、写和关闭等)。
  • 框架如图所示:

Linux 内核(Kernel)组成分析_第5张图片

4、网络子系统

在 Linux 内核中,与网络相关的代码被 Linux 独立开,形成一个相对独立的子系统,称为网络子系统,网络子系统是一个层次化的结构,可分为以下几个层次:

  • Socket 层(也可以称之为协议无关层):Linux 在发展过程中,采用 BSD Socket API 作为自己的网络相关的 API 接口。同时,Linux 的目标又要能支持各种不同的协议族,而且这些协议族都可以使用 BSD Socket API 作为应用层的编程接口,这样一来将 Socket 层抽象出来就能屏蔽不同协议族之间的差异,不会对应用层的使用产生影响。
  • 协议层:Linux 网络子系统功能上相当完备,它不仅支持 INET 协议族(也就是通常所说的 TCP/IP 协议族),而且还支持其它很多种协议族,如 INET6、DECnet,ROSE,NETBEUI 等,对于 INET 、INET6 协议族来说,又会进一步将协议族划分为传输层和网络层以及链路层等。
  • 网络设备层:网络设备其实是设备驱动层的内容了,它抽象了网卡数据结构,在一个系统中可能存在多种网卡,屏蔽了不同硬件上的差异,这一层提供了一组通用函数供底层网络设备驱动程序使用。
  • 框架如图所示:

Linux 内核(Kernel)组成分析_第6张图片

5、设备子系统

设备子系统又被称之为设备驱动,如 LCD、摄像头、USB、音频等都是属于设备,且设备的厂商不同其驱动程序也是不同的,但是对于 Linux 来说,不可能去将每个设备都包含到内核,它只能抽象去描述某种设备。

系统调用层是 Linux 内核与应用程序之间的接口,而设备驱动则是 Linux 内核与硬件之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作(打开、读、写和关闭)。

设备驱动程序是内核的一部分,主要功能:

  • 对设备初始化和释放
  • 把数据从内核传送到硬件和从硬件读取数据
  • 读取应用程序传送给设备文件的数据和回送应用程序请求的数据
  • 检测和处理设备出现的错误

根据设备的共性将设备分 类:

字符设备、块设备、网络设备

  • 字符设备,是以字节为单位传输的 IO 设备,可以提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。这种字符传输的效率通常是比较低的,如鼠标、键盘、串口等都是字符设备。
  • 块设备,是以块为单位进行传输的设备,应用程序可以随机访问块设备中的数据,程序可以指定读取数据的位置。磁盘就是一种常见的块设备,应用程序可以寻址磁盘上的任何位置,并在这个位置读取数据。块设备读取的数据只能以块为单位的倍数进行(通常是 512Byte 的整数倍),而不能与字符设备一样以字节为单位读取。块设备的传输速度是比较高的。
  • 网络设备,其实就是网络子系统中描述的网络设备层,统一描述了不同的网卡设备,如 WIFI、以太网等。因为网络设备存在协议栈(协议族),它涉及了网络层协议,所以 Linux 将网络设备单独分层一类设备。传输速率通常很高。
  • 框架如图所示:

Linux 内核(Kernel)组成分析_第7张图片

你可能感兴趣的:(linux,服务器,运维)