当前位置: 首页 > news >正文

Linux Kernel 3

Linux 内核概览(Overview of the Linux Kernel)


一、Linux 的开发模式(Linux Development Model)

Linux 内核是世界上最大规模的开源项目之一:

  • 拥有数千名开发者参与;
  • 每个版本发布时有上百万行代码被新增、修改或删除。

📜 授权协议:GPLv2

Linux 以 GPLv2 \text{GPLv2} GPLv2(GNU General Public License v2)授权发布。

🔒 核心条款
若某公司对内核进行修改,并将该软件销售或交付给客户,则这些修改后的源代码必须提供给客户

虽然法律上只要求提供给客户,实际上大多数公司都会将修改后的内核源代码公开发布,以维护社区贡献和合规性。


二、开发者结构与参与者

Linux 内核的开发者包括:

  • 各大公司(即使彼此竞争,也一起维护内核)
  • 学术机构
  • 独立开发者与爱好者

Linux 社区具有高度开放性和协作性


三、固定周期发布模型(Release Model)

当前 Linux 内核采用固定发布周期

  • 每 3~4 个月发布一个正式版本
  • 新功能通过Merge Window合并窗口并入主线。

发布流程:

  1. 合并窗口(Merge Window)

    • 持续 1~2 周;
    • 集中合并新功能和改动。
  2. 候选版本(Release Candidate, RC)

    • 每周发布一次,命名为 rc1rc2 等;
    • 进入测试与修复阶段。

四、维护者层级体系(Maintainer Hierarchy)

为了支撑如此庞大的开发量,Linux 内核采用分层的维护者模型

1. Linus Torvalds

  • Linux 之父,也是内核主维护者
  • 主要职责是:从各子系统维护者那里合并 Pull Request

2. 子系统维护者(Subsystem Maintainers)

  • 每个子系统(如网络、文件系统、内存管理等)由一位或多位维护者负责;
  • 他们从开发者或驱动作者处接受 patch 或 Pull Request。

3. 各自的 Git 树(Git Tree)

每个维护者都有自己的 Git 仓库,例如:

  • Linus Torvalds:
    git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
  • David Miller(网络子系统):
    git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/

五、-next 树与合并策略(-next Trees)

因为合并窗口只有两周,大多数子系统维护者会建立一个 -next 树

  • 该树用于接收下一轮合并窗口的功能补丁;
  • 即使主线 Merge Window 关闭,开发者仍可以提交补丁到 -next 分支;
  • 当新的合并窗口开启时,再由子系统维护者提交到 Linus 主线。

六、错误修复的特殊处理(Bug Fixes)

  • Bug 修复(特别是回归 bug 和安全问题)不受 Merge Window 限制
  • 维护者可以在任何时间将修复补丁合并进自己的维护树;
  • Linus 会在每个 RC 阶段定期从各子系统维护者处 pull 这些修复。

💡 Linux 的开发方式体现了模块化、分层协作和开放治理,是大型开源项目协作的典范。

在这里插入图片描述

Linux 源码顶层目录结构概览(Top-Level Linux Source Code Folders)


📁 arch

  • 含义:架构相关代码(Architecture-specific code)
  • 每种 CPU 架构(如 x86 \text{x86} x86 arm \text{arm} arm arm64 \text{arm64} arm64)都有独立子目录;
  • 包括启动流程、异常处理、汇编支持、MMU 初始化等平台特定实现。

📁 block

  • 含义:块设备子系统代码(Block Subsystem)
  • 管理块设备(如硬盘、SSD)读写流程:
    • 创建 I/O 请求
    • 请求合并与调度(支持多种调度器,如 CFQ , Deadline , BFQ \text{CFQ}, \text{Deadline}, \text{BFQ} CFQ,Deadline,BFQ
    • 下发至底层设备驱动

📌 块设备(Block Device):按“块”进行读写的设备,如磁盘,不同于按字节流工作的字符设备(如串口)。


📁 certs

  • 含义:证书验证支持模块
  • 实现数字签名校验逻辑;
  • 用于模块加载签名验证等内核安全机制。

📁 crypto

  • 含义:加密算法实现
  • 包含:
    • 各类软件加密算法(如 AES、SHA)
    • 一个可扩展框架:支持将加密操作卸载到硬件加速器

📁 Documentation

  • 含义:内核文档
  • 内容包括:
    • 各子系统设计说明
    • 命令行参数参考
    • sysfs 文件格式说明
    • 设备树绑定(Device Tree Bindings)文档

📁 drivers

  • 含义:设备驱动实现
  • 涵盖各种设备驱动代码;
  • 实现 Linux 驱动模型(Driver Model):抽象描述设备、驱动、总线和它们之间的连接方式。

📁 firmware

  • 含义:设备固件文件
  • 包含以二进制或十六进制形式存储的固件;
  • 供驱动加载(如 Wi-Fi、GPU 固件等)。

📁 fs

  • 含义:文件系统模块
  • 包含:
    • 通用虚拟文件系统( VFS, Virtual Filesystem Switch \text{VFS, Virtual Filesystem Switch} VFS, Virtual Filesystem Switch
    • 各种实际文件系统的驱动(如 ext4 \text{ext4} ext4 btrfs \text{btrfs} btrfs fat \text{fat} fat

📁 include

  • 含义:头文件目录
  • 存放内核各模块的公共和私有头文件;
  • 是整个编译系统的核心依赖之一。

📁 init

  • 含义:通用启动初始化代码
  • 执行系统启动阶段的初始化逻辑(非架构专属);
  • 包括 init 进程初始化、命令行解析等。

📁 ipc

  • 含义:进程间通信机制实现(Inter Process Communication)
  • 提供:
    • 消息队列(message queue)
    • 信号量(semaphores)
    • 共享内存(shared memory)

📁 kernel

  • 含义:内核核心代码
  • 包括:
    • 进程管理
    • 内核线程、工作队列( workqueue \text{workqueue} workqueue
    • 调度器(Scheduler)
    • 时间管理、IRQ 中断处理、锁机制等

📁 lib

  • 含义:通用库函数
  • 提供:
    • 排序、校验和、压缩/解压缩
    • 位图处理、数学函数、哈希表等通用逻辑

📁 mm

  • 含义:内存管理(Memory Management)
  • 涵盖:
    • 物理内存与虚拟内存的管理
    • 分配器(如 SLAB \text{SLAB} SLAB SLUB \text{SLUB} SLUB CMA \text{CMA} CMA
    • 分页机制、交换(swap)、虚拟地址映射等

📁 net

  • 含义:网络协议栈实现
  • 包括:
    • IPv4 / IPv6 协议
    • BSD socket 实现
    • 路由、包调度、网桥、流控等模块

📁 samples

  • 含义:示例代码
  • 提供设备驱动或子系统的示例实现,方便开发者参考。

📁 scripts

  • 含义:构建与工具脚本
  • 包括:
    • 内核模块构建脚本
    • kconfig \text{kconfig} kconfig 配置系统
    • 检查补丁风格的脚本(如 checkpatch.pl

📁 security

  • 含义:Linux 安全模块框架(LSM)
  • 实现:
    • 安全扩展模块,如 SELinux , AppArmor , Smack , Tomoyo \text{SELinux}, \text{AppArmor}, \text{Smack}, \text{Tomoyo} SELinux,AppArmor,Smack,Tomoyo
    • 基于钩子的访问控制机制

📁 sound

  • 含义:音频系统支持
  • 包括:
    • ALSA \text{ALSA} ALSA(Advanced Linux Sound Architecture,高级音频框架)
    • 旧的 OSS \text{OSS} OSS(Open Sound System)

📁 tools

  • 含义:用户态工具集
  • 提供用于测试、调试或与内核子系统交互的工具程序(如 perf, bpf 工具等)

📁 usr

  • 含义:内嵌 initrd 支持
  • 支持将 initrd 初始根文件系统嵌入进内核镜像中。

📁 virt

  • 含义:KVM 虚拟化子系统
  • 包含 KVM \text{KVM} KVM(Kernel-based Virtual Machine)的核心代码;
  • 提供对硬件虚拟化支持(Intel VT、AMD-V 等)。

在这里插入图片描述

Linux 内核核心子系统详解(详细概览)


📁 arch - 架构相关代码(Architecture Specific Code)

该目录包含与特定 CPU 架构(如x86、ARM、MIPS等)相关的实现:

  • 可进一步细分为机器特定代码(machine specific code),例如针对特定主板或 SoC 的支持;
  • 包含与启动加载器(boot loader)的接口,以及架构初始化流程;
  • 提供对架构特定硬件的访问接口,包括:
    • 中断控制器(interrupt controller)
    • 多核处理控制器(SMP controllers)
    • 总线控制器(BUS controllers)
    • 异常与中断初始化(exceptions & interrupt setup)
    • 虚拟内存处理(virtual memory handling)

此外还实现了架构优化函数(例如 m e m c p y memcpy memcpy、字符串操作等)。

🏗️ Linux 最初是在 32 32 32位的 x 86 x86 x86(386及以上)架构上开发的。如今支持的架构包括(但不限于):

  • Compaq Alpha AXP、Sun SPARC、Motorola 68000、PowerPC、ARM、IBM S/390、MIPS、IA-64、AMD x86-64等

📁 drivers - 设备驱动

Linux 内核使用统一的设备模型(device model),用于维护反映系统当前状态的数据结构,包括:

  • 当前存在哪些设备
  • 它们连接在哪个总线上
  • 它们关联到哪个驱动程序
  • 当前状态是否活动

这些信息对于实现系统电源管理设备热插拔设备发现与移除等功能至关重要。

每个子系统都有特定的驱动接口,针对其代表的设备类型设计,以简化驱动编写并减少重复代码。

支持的设备类型极其广泛,包括:

  • TTY、串口(serial)、SCSI、文件系统、以太网、USB、帧缓冲(framebuffer)、输入设备、音频等

👤 进程管理(Process Management)

Linux 实现了标准 Unix 风格的进程管理接口:

  • f o r k ( ) fork() fork():创建子进程
  • e x e c ( ) exec() exec():替换当前进程映像
  • w a i t ( ) wait() wait():等待子进程结束
  • POSIX 线程支持(pthreads)

但与其他操作系统不同:

  • 内核没有分开的“进程”或“线程”结构;
  • 所有任务都用一个统一的数据结构描述: s t r u c t   t a s k _ s t r u c t struct\ task\_struct struct task_struct,代表一种抽象的调度单元(task)。

每个任务包含指向各种资源的指针,如:

  • 地址空间(address space)
  • 文件描述符(file descriptors)
  • IPC 资源(信号量、消息队列、共享内存等)

同一个进程中的多个任务共享资源指针;
不同进程的任务拥有独立资源指针。

这种抽象模型,加上 c l o n e ( ) clone() clone() u n s h a r e ( ) unshare() unshare()系统调用,支持构建如**命名空间(namespace)**这类先进特性。

✳️ 命名空间(Namespace)

用于对进程视图进行隔离(如文件系统、PID、网络栈等),配合控制组 c g r o u p cgroup cgroup实现 Linux 容器化(操作系统级虚拟化)。

✳️ 控制组(cgroup)

允许将进程分层管理,并按照配置规则对系统资源(如CPU、内存、IO)进行分配。


🧠 内存管理(Memory Management)

Linux 的内存管理子系统非常复杂,主要包括:

1. 物理内存管理(Physical Memory)

  • 分配与释放实际 RAM 空间
  • 页帧管理(page allocator)

2. 虚拟内存管理(Virtual Memory)

  • 分页机制(paging)
  • 交换空间(swapping)
  • 按需加载(demand paging)
  • 写时复制(Copy-on-write)

3. 用户服务接口

  • 管理用户空间内存: m m a p ( ) mmap() mmap() b r k ( ) brk() brk()、共享内存( s h m shm shm

4. 内核服务接口

  • 内核分配器: S L A B SLAB SLAB/ S L U B SLUB SLUB/ S L O B SLOB SLOB
  • 虚拟分配接口: v m a l l o c vmalloc vmalloc、高端内存管理等

💽 块 I/O 管理(Block I/O Management)

Linux 的块 I/O 子系统处理与块设备(如硬盘、SSD)的读写操作,工作流程包括:

  • 创建块 I/O 请求(block I/O requests)
  • 请求重组与转换(如用于软件 RAID、LVM)
  • 请求合并与排序
  • 通过多个 I/O 调度器调度请求并下发给块设备驱动程序
    在这里插入图片描述

常见的调度器包括 n o o p noop noop d e a d l i n e deadline deadline c f q cfq cfq b f q bfq bfq


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

Linux 的 VFS(Virtual Filesystem Switch)实现了一套通用/抽象的文件系统接口,用于简化和统一各种实际文件系统驱动的开发,避免代码重复。

VFS 引入了多个关键数据结构,用于抽象表示文件系统内部的各个组成部分:
在这里插入图片描述


📂 核心结构体(文件系统抽象)

  • i n o d e inode inode:表示磁盘上的文件本体,包括:

    • 文件属性(如权限、大小、创建时间等)
    • 数据块在磁盘上的位置
  • d e n t r y dentry dentry(目录项):将 i n o d e inode inode与一个文件名 目录结构中的路径关联起来;

    • 例如:路径 " / h o m e / u s e r / f i l e . t x t " "/home/user/file.txt" "/home/user/file.txt"对应某个 i n o d e inode inode d e n t r y dentry dentry条目
  • f i l e file file:表示一个打开的文件,包含文件状态信息:

    • 如当前文件偏移(file pointer)
    • 访问权限、标志等
  • s u p e r b l o c k superblock superblock:描述整个已格式化的文件系统的元信息,包括:

    • 总块数(number of blocks)
    • 块大小(block size)
    • 根目录所在磁盘位置
    • 是否启用加密等信息

🧠 缓存机制(Caching in VFS)

为了提高文件系统性能,VFS 实现了一套多层缓存机制:

1. i n o d e inode inode 缓存

  • 缓存文件属性与内部元信息(metadata)
  • 减少对磁盘的频繁访问

2. d e n t r y dentry dentry 缓存

  • 缓存目录结构(路径信息),加快路径解析(path lookup)

3. 页面缓存( p a g e page page cache)

  • 缓存文件内容(数据块);
  • 数据读写操作优先走内存,提升性能,避免频繁读写磁盘

Linux 安全模块(LSM:Linux Security Modules)

Linux 安全模块(LSM)是一套钩子机制(hook mechanism),用于扩展默认的 Unix 权限模型,支持各种安全框架。

LSM 的主要功能是:允许内核在敏感操作(如访问文件、创建进程)前后插入自定义的安全检查逻辑。


🔒 已集成的主要安全模块(基于 LSM)

  • SELinux(Security-Enhanced Linux):基于强制访问控制(MAC)的安全模块
  • AppArmor:基于配置文件路径规则的 MAC 实现
  • Tomoyo:可视化策略定义系统,强调人类可读性
  • Smack(Simplified Mandatory Access Control Kernel):简化的 MAC 模块

📌 通过 LSM,Linux 可以支持企业级强安全隔离、容器安全、最小权限设计等。


相关文章:

  • LDAP渗透测试
  • java 线程池:IO密集型的任务(CPU核数 * 2 + 1),为什么这么设置,计算密集型任务( CPU核数+1 ),为什么这么设置
  • 火车头采集动态加载Ajax数据(无分页瀑布流网站)
  • Python numpy 与pandas
  • Apache Commons CLI 入门教程:轻松解析命令行参数
  • 运维面试题(十三)
  • linux一次启动多个jar包
  • 一键解锁Landsat 9地表温度计算!ENVI与ArcGIS Pro全流程详解(无需NASA大气校正)
  • 解决前端使用Axios时的跨域问题
  • 《MySQL从入门到精通》
  • 【数据集】上市公司投资效率及非效率投资数据测算+dofile(2000-2023年)
  • 深入理解计算机系统记录
  • README.md 完全指南:Markdown 语法+实例
  • 消息中间件kafka,rabbitMQ
  • MQTT、HTTP短轮询、HTTP长轮询、WebSocket
  • OBOO鸥柏如何以智能教育室内外触摸屏一体机AI变革硬件
  • 在Spring Boot中浅尝内存泄漏
  • C++多态知识点梳理
  • Java笔记5——面向对象(下)
  • 如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
  • 警方通报:某博主遭勒索后自杀系自导自演,已立案调查
  • 中方发布会:中美经贸高层会谈取得了实质性进展,达成了重要共识
  • 未来之城湖州,正在书写怎样的城市未来
  • 习近平会见缅甸领导人敏昂莱
  • 三星“七天机”质保期内屏幕漏液被要求自费维修,商家:系人为损坏
  • 独家丨刘家琨获普利兹克奖感言:守护原始的感悟力