Linux 内核(Kernel)组成分析

一、Linux内核简介

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

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

Linux 内核组成 :

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

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

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

 

二、Linux内核组成

1、进程管理子系统

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

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

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

(2)进程的四要素:

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

(3)进程的堆栈:

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

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

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

(5)进程调度:

  • 进程调度是进程管理子系统中最重要的一个功能,是一个管理进程之间使用 CPU 资源的管理程序。
  • 进程调度器有效地为各个进程分配其使用的 CPU 资源时间,同时又要达到良好的用户体验效果,此外调度器还需要解决一些互相冲突的情况,例如既要实现实时任务的最小化响应时间, 又要最大限度地提高 CPU的总体利用率等。
  • Linux2.6 版本之后,进程调度器使用新的进程调度算法——Completely Fair Scheduler,简称 CFS,即完全公平调度算法该算法会按所需分配的计算能力,向系统中每个进程提供最大的公正性,它负责将 CPU 资源,分配给正在执行的进程,目标在于最大化程式互动效能,最小化整体 CPU 的运用,这个算法使用红黑树来实现,算法效率为 O(log(n))

(6)进程状态:

 
 
 

就绪态 R

(TASK_RUNNING)

(可执行状态)

该状态的进程才能被允许参与调度器调度并且使用 CPU 资源,而同一时刻可能有多个进程处于就绪态,这些进程的 task_struct 结构(进程控制块)被放入对应 CPU 的可执行队列中(一个进程最多只能出现在 一个 CPU 的可执行队列中)。
进程调度器的任务就是从各个 CPU 的可执行队列中分别选择一个进程在该 CPU 上运行。

运行态 R

(TASK_RUNNING)

进程正在使用 CPU 资源。
提示:很多操作系统的书将正在 CPU 上执行的进程定义为 RUNNING 状态、而将可执行但是尚未被调度执行的进程定义为 READY 状态,这两种状态在 linux 下统一为 TASK_RUNNING 状态

暂停态 T

(TASK_STOPPED or TASK_TRACED)

向进程发送  SIGSTOP 信号,进入 TASK_STOPPED 状态
向进程发送  SIGCONT 信号,从 TASK_STOPPED 状态恢复到 TASK_RUNNING 状态,当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态。
”正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在 gdb 中对被跟踪的进程下一个断点,进程在 断点 处停下来的时候就处于 TASK_TRACED 状态。

可中断睡眠态 S (TASK_INTERRUPTIBLE)

(睡眠态)

因为等待某些事件的发生而进入睡眠状态(比如等待 socket 连接、等待信号量等)。
当这些事件发生的时候进程将被唤醒,如产生一个硬件中断、释放进程正在等待的系统资源或是传递一个信号都可以是唤醒进程的条件。
系统的大多数进程都是处于这个状态,在终端可以通过 ps –aux 命令查看系统进程状态。

不可中断睡眠状态 D (TASK_UNINTERRUPTIBLE)

(深度睡眠态)

把信号传递到这种睡眠状态的进程不能改变它的状态,也就是说它不响应信号的唤醒,这种状态一般由 IO 引起, 同步 IO 在做读或写操作 时(比如进程对某些硬件设备进行操作,等待磁盘 IO ,等待网络 IO ),此时 CPU 不能做其它事情,只能处于这种状态进行等待,这样一来就能保证进程执行期间不被外部信号打断。

僵死态 Z

(TASK_DEAD - EXIT_ZOMBIE)

僵尸态或者退出态

进程退出 的过程中,除了 task_struct 数据结构(以及少数资源)以外,进程所占有的资源将被系统回收,此时进程没法继续运行了,但它还有 task_struct 数据结构,所以被称为僵死态。
之所以保留 task_struct 数据结构,是因为 task_struct 中保存了进程的退出码、以及一些其他的信息,而其父进程很可能会关心这些信息,因此会暂时被保留下来。
 
 

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 SystemVFS),虚拟文件系统屏蔽了各种硬件上的差异以及具体实现的细节,为所有的硬件设备提供统一的接口,即实现了设备无关性,同时文件管理系统还为应用层提供统一的 API 接口。
  • Linux 的文件系统体系结构是对一个对复杂系统进行了抽象化,通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持多种文件系统,如 NTFSEXT2EXT3EXT4 FAT 等等;而用户空间包含一些应用程序和 GNU C 库(glibc),它们使用的 API 接口是由系统调用层提供(如打开、读、写和关闭等)。
  • 框架如图所示:
 
 

4、网络子系统

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

 

 

5、设备子系统

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

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

设备驱动程序是内核的一部分,主要功能:
  • 对设备初始化和释放
  • 把数据从内核传送到硬件和从硬件读取数据
  • 读取应用程序传送给设备文件的数据和回送应用程序请求的数据
  • 检测和处理设备出现的错误
根据设备的共性将设备分 类:

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

  • 字符设备,是以字节为单位传输的 IO 设备,可以提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。这种字符传输的效率通常是比较低的,如鼠标、键盘、串口等都是字符设备。
  • 块设备,是以块为单位进行传输的设备,应用程序可以随机访问块设备中的数据,程序可以指定读取数据的位置。磁盘就是一种常见的块设备,应用程序可以寻址磁盘上的任何位置,并在这个位置读取数据。块设备读取的数据只能以块为单位的倍数进行(通常是 512Byte 的整数倍),而不能与字符设备一样以字节为单位读取。块设备的传输速度是比较高的。
  • 网络设备,其实就是网络子系统中描述的网络设备层,统一描述了不同的网卡设备,如 WIFI、以太网等。因为网络设备存在协议栈(协议族),它涉及了网络层协议,所以 Linux 将网络设备单独分层一类设备。传输速率通常很高。
  • 框架如图所示:
 
 
文章参照: [野火]i.MX Linux开发实战指南 归纳总结笔记
 
 
 
 
  • 15
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核由几大子系统构成,包括进程调度、进程间通信(IPC)、内存管理、虚拟文件系统和网络接口等子系统。这些子系统相互独立但又紧密关联,它们共同构成了Linux内核的核心功能。 此外,Linux内核还采用了宏内核架构,即大部分功能都会在内核中实现,如进程管理、内存管理、设备管理、文件管理以及网络管理等功能,它们运行在内核空间中。这些功能是在内核中实现的,以提供更高效和可靠的操作系统服务。 另外,Linux内核还支持内核模块的机制,这是一种动态可加载的插件接口,使得内核能够根据需要加载和卸载功能模块,以实现更加灵活和可扩展的系统功能。内核模块是Linux内核向外部提供的一个接口,可以在运行时动态地添加或移除功能。总体而言,Linux内核包含了各个子系统的功能以及支持内核模块的机制,以实现一个完整且功能强大的操作系统内核。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux 内核Kernel组成分析](https://blog.csdn.net/p1279030826/article/details/105998601)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Linux内核主要组成部分有哪些?](https://blog.csdn.net/epubit17/article/details/130619578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Linux内核模块编程入门学习](https://download.csdn.net/download/weixin_38601499/14815193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值