Linux内核之概观

目录

[1. Linux开发模式](#1. Linux开发模式)

[2. 维护者层级](#2. 维护者层级)

[3. Linux 源代码布局](#3. Linux 源代码布局)

[4. Linux 内核架构](#4. Linux 内核架构)

[4.1 arch(architecture)](#4.1 arch(architecture))

[4.2 设备驱动](#4.2 设备驱动)

[4.3 进程管理](#4.3 进程管理)

[4.4 内存管理](#4.4 内存管理)

[4.5 块 I/O 管理](#4.5 块 I/O 管理)

[4.6 虚拟文件系统开关(Virtual Filesystem Switch)](#4.6 虚拟文件系统开关(Virtual Filesystem Switch))

[4.7 网络栈](#4.7 网络栈)

[4.8 Linux 安全模块](#4.8 Linux 安全模块)


1. Linux开发模式

Linux 内核是全球最大的开源项目之一,拥有数千名贡献代码的开发者,且每次发布版本都会涉及数百万行代码的变更。

该项目基于 GPLv2 许可证发布简而言之,该许可证要求:如果包含内核修改的软件被交付给客户,则必须向客户提供相应的修改内容(尽管在实际操作中,大多数公司都会直接公开源代码)。

许多公司(其中不乏竞争对手)以及学术界人士和独立开发者,都在为 Linux 内核贡献代码。

目前的开发模式基于固定的发布周期(通常为 3 到 4 个月)。新功能会在为期一到两周的"合并窗口期"内合入内核。合并窗口期结束后,项目会按周发布候选版本(如 rc1、rc2 等)。

2 . 维护者层级

为了扩展开发流程,Linux 采用了分层维护模式:

● Linus Torvalds 是 Linux 内核的维护者,负责合并来自子系统维护者的拉取请求( pull requests )。

● 每个子系统都有一名或多名维护者,负责接收来自开发者或设备驱动程序维护者的补丁(patch)或拉取请求(pull request)。

● 每位维护者都有自己的 Git 树,例如:

(1) Linux Torvalds:

git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

(2)

David Miller (networking):

git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/

● 每个子系统都可以维护一个"-next"树,供开发人员提交针对下一个合并窗口的补丁。

由于合并窗口最长仅为两周,大多数维护者都维护着一个"-next"分支(tree);即便在合并窗口关闭期间,他们也能通过该分支接收来自开发者或下游维护者提交的新功能。

值得注意的是,即使在合并窗口关闭期间,维护者的分支仍会接受错误修复;上游维护者会针对每一个发布候选版本(release candidate),定期从这些分支中拉取(pull)这些修复内容。

3 . Linux源代码布局

这些是 Linux 源代码文件夹的顶层目录

● arch(architecture) ------ 包含具体架构的代码;每种架构都在指定的子文件夹(例如 arm,arm64,x86)中实现。

● block ------ 包含处理块设备数据读写的块子系统代码:创建块 I/O 请求、调度请求(有多种 I/O 调度器可供选择)、合并请求,以及将请求通过 I/O 栈向下传递给块设备驱动程序。

● certs ------ 实现对使用证书进行签名验证的支持。

● crypto ------ 各种密码学算法的软件实现,以及支持将此类算法卸载至硬件执行的框架。

● Documentation ------ 各类子系统的文档、Linux 内核命令行选项、sysfs 文件及其格式的说明、设备树绑定(支持的设备树节点及格式)。

● drivers ------ 针对各种设备的驱动程序,以及 Linux 驱动程序模型实现(一种描述驱动程序、设备、总线及其连接方式的抽象)。

● firmware ------ 由各种设备驱动程序使用的二进制或十六进制固件文件 。

● fs ------ 虚拟文件系统切换层(通用文件系统代码)及各种文件系统驱动程序存放处。

● include ------ 头文件。

● init ------ 在引导期间运行的通用(即非特定于架构的)初始化代码。

● ipc ------ 针对消息队列、信号量、共享内存等各种进程间通信(IPC)系统调用的实现。

● kernel ------ 进程管理代码(包括对内核线程和工作队列的支持)、调度器、追踪、时间管理、通用中断(IRQ)代码、锁机制。

● lib ------ 各种通用功能,如排序、校验和、压缩与解压缩、位图操作等。

● mm ------ 涉及物理内存与虚拟内存的内存管理代码,包括页(page)、SL*B 和 CMA 分配器、交换(swapping)、虚拟内存映射、进程地址空间操作等。

● net ------ 针对包括 IPv4 和 IPv6 在内的各种网络协议栈的实现;BSD 套接字实现、路由、过滤、数据包调度、桥接等。

● samples ------ 各种驱动的例子。

● scripts ------ 构建系统组件、用于构建模块的脚本、Linux 内核配置工具 kconfig,以及其他各类脚本( 例如用于检查补丁是否符合 Linux 内核编码风格的 checkpatch.pl )。

● security ------ 这里是 Linux 安全模块( Linux Security Module )框架的存放处,该框架允许扩展默认的(Unix)安全模型,同时也包含了 SELinux、Smack、AppArmor、Tomoyo 等多种此类扩展的实现。

● sound ------ ALSA(高级 Linux 声音系统)及旧版 Linux 声音框架(OSS)存放处。

● tools ------ 用于测试 Linux 内核子系统或与其交互的各种用户空间工具。

● usr ------ 支持将 initrd 文件嵌入到内核镜像中。

● virt ------ KVM(内核虚拟机) hypervisor 的发源地。

4 . Linux内核架构

4.1 arch(architecture)

● 架构相关代码。

● 可能进一步细分为机器相关代码。

● 与引导加载程序交互以及架构相关初始化。

● 访问各种架构或机器特定的硬件位,例如中断控制器、SMP 控制器、总线控制器、异常和中断设置、虚拟内存处理。

● 架构优化函数(例如 memcpy、字符串操作等)。

Linux 内核的这一部分包含特定于架构的代码,并且可能针对某些架构(例如 ARM)进一步细分为特定于机器的代码。

"Linux 最初是为基于 32 位 x86 架构的个人电脑( 386 或更高版本 )开发的。如今,它至少可以在 Compaq Alpha AXP、Sun SPARC 和 UltraSPARC、Motorola 68000、PowerPC、PowerPC64、ARM、Hitachi SuperH、IBM S/390、MIPS、HP PA-RISC、Intel IA-64、DEC VAX、AMD x86-64 和 CRIS 架构上运行。"

它实现了对各种特定于架构或机器的硬件位的访问,例如中断控制器、SMP 控制器、总线控制器、异常处理和中断建立、虚拟内存处理。

它还实现了针对特定架构优化的功能(例如 memcpy、字符串操作等)。

4.2 设备驱动

Linux 内核使用统一设备模型,其目的是维护反映系统状态和结构的内部数据结构。这些信息包括哪些设备存在、它们的状态、它们连接到哪个总线、它们连接到哪个驱动程序等等。这些信息对于实现系统级电源管理、设备发现和动态设备移除至关重要。

每个子系统都有其特定的驱动程序接口,这些接口针对其所代表的设备进行了定制,以便于编写正确的驱动程序并减少代码重复。

Linux 支持种类繁多的设备驱动程序,例如:TTY、串口、SCSI、文件系统、以太网、USB、帧缓冲区、输入、声音等等。

4.3 程管理

Linux 实现了标准的 Unix 进程管理 API,例如 fork()、exec() 和 wait(),以及标准的 POSIX 线程。

然而,Linux 进程和线程的实现方式与其他内核截然不同。Linux 没有内部结构来实现进程或线程,而是使用一个名为 task_struct 的结构体来描述一个名为 task 的抽象调度单元

一个 task 拥有指向资源的指针,例如地址空间、文件描述符、IPC ID 等。属于同一进程的任务的资源指针指向相同的资源,而不同进程的任务的资源指针则指向不同的资源。

这种特性,结合 clone() 和 unshare() 系统调用,使得 Linux 能够实现命名空间等新特性。

命名空间与控制组 ( cgroup ) 结合使用,在 Linux 中实现操作系统虚拟化。

cgroup 是一种以可控且可配置的方式,将进程分层组织并沿层次结构分配系统资源的机制。

4.4 内存管理

Linux 内存管理是一个复杂的子系统,它处理以下问题:

● 物理内存管理:内存分配和释放。

● 虚拟内存管理:分页、交换、按需分页、写时复制。

● 用户服务:用户地址空间管理(例如 mmap()、brk()、共享内存)。

● 内核服务:SL*B 分配器、vmalloc 。

4.5 I/O 管理

Linux 块 I/O 子系统处理从块设备读取和写入数据:创建块 I/O 请求、转换块 I/O 请求(例如,用于软件 RAID 或 LVM)、合并和排序请求,并通过各种 I/O 调度程序将它们调度到块设备驱动程序。

4.6 虚拟文件系统开关(Virtual Filesystem Switch)

Linux虚拟文件系统开关实现了通用文件系统代码,以减少文件系统驱动程序中的重复代码。它引入了一些文件系统抽象概念,例如:

● inode ------ 描述磁盘上的文件(属性、数据块在磁盘上的位置)。

● dentry ------ 将 inode 与文件名关联起来(目录项)。

● file ------ 描述已打开文件的属性(例如文件指针)。

● superblock ------ 描述已格式化文件系统的属性(例如块数、块大小、根目录在磁盘上的位置、加密方式等)。

Linux VFS 还实现了一种复杂的缓存机制,其中包括以下内容:

● inode 缓存 ------ 缓存文件属性和内部文件元数据。

● dentry 缓存 ------ 缓存文件系统的目录层次结构。

● page 缓存 ------ 缓存内存中的文件数据块。

4.7 网络栈

4.8 Linux安全模块

● 用于扩展默认 Linux 安全模型的钩子。

● 被多个 Linux 安全扩展程序使用:

(1) 安全增强型 Linux

(2) AppArmor

(3) Tomoyo

(4) Smack

相关推荐
M78佐菲11 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
ltl12 小时前
QUIC 协议拆解(上):为什么 TCP 改不动了
linux
Linux-lucky13 小时前
28-Linux学习之旅之Maven与Nexus制品库
linux·运维·学习·nginx·tomcat·maven
敲代码还房贷15 小时前
VMware17 + Ubuntu22.04 共享 完整步骤
linux·python·ubuntu
King of fraud16 小时前
Linux 下 MySQL 基础操作:创建用户、数据库与权限管理实战
linux·数据库·mysql
实心儿儿17 小时前
Linux —— 传输层协议TCP
linux·服务器·tcp/ip
祖力5517 小时前
Linux应用软件编程:目录IO与framebuffer
linux·运维·算法·framebuffer·目录io
词却17 小时前
Linux基础:常用基本命令与软件包管理
linux
2401_8906034018 小时前
Linux 进程控制
linux·运维·服务器