Linux内核组成分析【转载】
Linux内核定义
Linux内核是Linux操作系统的核心部分,它是一个类Unix的操作系统内核,提供了必要的服务并管理系统资源。内核充当硬件和软件层之间的接口,使操作系统能够与底层硬件 组件进行通信和控制。以下是Linux内核的一些重要功能:
- 进程管理:内核管理进程的执行,分配CPU时间、内存和输入/输出(I/O)设备等系统资源。它调度进程、在它们之间切换,并确保公平和高效的资源利用。
- 内存管理:内核处理内存管理,包括为进程分配和释放内存以及管理虚拟内存系统。它提供内存保护、虚拟内存映射和在物理内存和磁盘存储之间交换数据的机制。
- 设备驱动程序:内核包括设备驱动程序,使操作系统能够与硬件设备(如磁盘驱动器、网络接口、图形卡和输入设备)进行通信。这些驱动程序促进数据传输、设备控制和与硬件的交互。
- 文件系统管理:内核管理文件系统,提供创建、读取、写入和删除文件所需的接口和操作。它处理文件访问权限、文件元数据和目录结构。
- 网络:内核实现网络协议,允许在局域网(LAN)和互联网上进行通信。它管理网络接口、路由表、网络协议(如TCP/IP)和套接字通信。
- 安全性:内核包括安全机制,用于保护系统和用户数据。它执行访问控制策略、处理用户身份验证、管理权限,并在进程之间提供隔离。
- 进程间通信:内核通过管道、套接字、共享内存和信号等机制促进进程之间的通信和数据交换。
Linux内核组成
Linux 内核主要由 5 部分组成,分别为:进程管理子系统,内存管理子系统,文件子系统,网络子系统,设备子系统。由系统调用层(系统调用子系统)进行统一管理,应用层通过系统调用层的函数接口与内核进行交互,用户应用程序执行的地方是用户空间,用户空间之下则是内核空间,Linux 内核正是位于内核空间中。
Linux内核组成-进程管理子系统
Linux内核的进程管理子系统由多个组件组成,包括调度程序、进程控制块、进程调度、进程同步和进程通信等。这些组件共同协作,负责管理和控制系统中的进程。以下是Linux内核进程管理子系统的一些关键组成部分:
- 调度程序(Scheduler):负责决定在多个就绪态进程中选择哪一个进程运行。Linux内核使用多种调度算法,如CFS(Completely Fair Scheduler),该算法会按所需分配的计算能力,向系统中每个进程提供最大的公正性,它负责将 CPU 资源,分配给正在执行的进程,目标在于最大化程式互动效能,最小化整体 CPU 的运用,这个算法使用红黑树来实现,算法效率为 O(log(n))
- 进程控制块(Process Control Block,PCB):每个进程都有一个PCB,用于存储进程的状态信息、标识符、优先级、调度信息等。PCB是内核用来管理进程的重要数据结构。
- 进程调度(Process Scheduling):Linux内核使用时间片轮转和优先级调度等技术来决定进程的运行顺序和时间分配。进程调度是进程管理子系统中最重要的一个功能,是一个管理进程之间使用 CPU 资源的管理程序。
- 进程同步(Process Synchronization):Linux提供了多种机制来实现进程间的同步,如信号量、互斥锁、条件变量等,以确保多个进程之间的协调和同步。
- 进程通信(Inter-Process Communication,IPC):Linux内核提供了多种IPC机制,如管道、消息队列、共享内存和信号等,用于实现进程之间的通信和数据交换。
Linux内核组成-内存管理子系统
- 内存管理单元(Memory Management Unit,MMU)负责管理每个进程完成从虚拟内存到物理内存的转换,以及系统可用内存空间。
- 分页管理内存,分页就是把系统的物理内存按照相同大小等分,每个内存分片称作内存页,通常内存页大小是 4KB。内存管理子系统要管理的不仅是 4KB 缓冲区,它提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配管理结构,并跟踪内存页使用情况。系统就支持动态调整内存使用情况。
- 内存交换,因为 Linux 中使用的是虚拟内存,当物理内存不足时,内存管理子系统会将内存暂时移到磁盘中,在物理内存充裕时又将内存页从磁盘移到物理内存中。
Linux内核组成-文件管理子系统
- 在 Linux 系统中一切皆文件,它把一切资源都看作是文件,包括硬件设备,通常称为设备文件。
- Linux 的文件管理子系统主要实现了虚拟文件系统(Virtual File System,VFS),虚拟文件系统屏蔽了各种硬件上的差异以及具体实现的细节,为所有的硬件设备提供统一的接口,即实现了设备无关性,同时文件管理系统还为应用层提供统一的 API 接口。
- Linux 的文件系统体系结构是对一个对复杂系统进行了抽象化,通过使用一组通用的 API 函数,Linux 可以在许多种存储设备上支持多种文件系统,如 NTFS、EXT2、EXT3、EXT4 、FAT 等等;而用户空间包含一些应用程序和 GNU C 库(glibc),它们使用的 API 接口是由系统调用层提供(如打开、读、写和关闭等)
Linux内核组成-网络子系统
在 Linux 内核中,与网络相关的代码被 Linux 独立开,形成一个相对独立的子系统,称为网络子系统,网络子系统是一个层次化的结构,可分为以下几个层次:
- Socket 层(也可以称之为协议无关层):Linux 在发展过程中,采用 BSD Socket API 作为自己的网络相关的 API 接口。同时,Linux 的目标又要能支持各种不同的协议族,而且这些协议族都可以使用 BSD Socket API 作为应用层的编程接口,这样一来将 Socket 层抽象出来就能屏蔽不同协议族之间的差异,不会对应用层的使用产生影响。
- 协议层:Linux 网络子系统功能上相当完备,它不仅支持 INET 协议族(也就是通常所说的 TCP/IP 协议族),而且还支持其它很多种协议族,如 INET6、DECnet,ROSE,NETBEUI 等,对于 INET 、INET6 协议族来说,又会进一步将协议族划分为传输层和网络层以及链路层等。
- 网络设备层:网络设备其实是设备驱动层的内容了,它抽象了网卡数据结构,在一个系统中可能存在多种网卡,屏蔽了不同硬件上的差异,这一层提供了一组通用函数供底层网络设备驱动程序使用。
Linux内核组成-设备子系统
设备子系统又被称之为设备驱动,如 LCD、摄像头、USB、音频等都是属于设备,且设备的厂商不同其驱动程序也是不同的,但是对于 Linux 来说,不可能去将每个设备都包含到内核,它只能抽象去描述某种设备。
系统调用层是 Linux 内核与应用程序之间的接口,而设备驱动则是 Linux 内核与硬件之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作(打开、读、写和关闭)。
设备驱动程序是内核的一部分,主要功能:
* 对设备初始化和释放
* 把数据从内核传送到硬件和从硬件读取数据
* 读取应用程序传送给设备文件的数据和回送应用程序请求的数据
* 检测和处理设备出现的错误
根据设备的共性将设备分类:
* 字符设备,是以字节为单位传输的 IO 设备,可以提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。这种字符传输的效率通常是比较低的,如鼠标、键盘、串口等都是字符设备。
* 块设备,是以块为单位进行传输的设备,应用程序可以随机访问块设备中的数据,程序可以指定读取数据的位置。磁盘就是一种常见的块设备,应用程序可以寻址磁盘上的任何位置,并在这个位置读取数据。块设备读取的数据只能以块为单位的倍数进行(通常是 512Byte 的整数倍),而不能与字符设备一样以字节为单位读取。块设备的传输速度是比较高的。
* 网络设备,其实就是网络子系统中描述的网络设备层,统一描述了不同的网卡设备,如 WIFI、以太网等。因为网络设备存在协议栈(协议族),它涉及了网络层协议,所以 Linux 将网络设备单独分层一类设备。传输速率通常很高。
文章参照:
https://blog.csdn.net/p1279030826/article/details/105998601
https://tutorial.linux.doc.embedfire.com/zh_CN/latest/