Linux内核分析之总览
Linux 7.0 内核详解
目录
第一部分:基础知识
- 第1章:x86_64 体系结构概览
- 1.1 寄存器与数据类型
- 1.2 CPU 运行模式:实模式、保护模式与长模式
- 1.3 分段与分页机制
- 1.4 中断与异常
- 1.5 特权级与保护机制
- 2.1 启动流程概览
- 2.2 固件阶段:BIOS 与 UEFI
- 2.3 引导加载程序与 Linux Boot Protocol
- 2.4 实模式设置代码(Real-Mode Setup)
- 2.5 从实模式到保护模式:跨越 16 位到 32 位的鸿沟
- 2.6 从保护模式到长模式——进入 64 位世界
- 2.7 内核解压与重定位
- 2.8 内核真正的入口:head_64.S
- 2.9 早期 C 初始化:head64.c 中的第一个 C 函数
- 2.10 UEFI 直接引导路径
- 3.1 start_kernel() 总览
- 3.2 setup_arch() — x86 架构相关初始化
- 3.3 早期内存管理初始化
- 3.4 调度器初始化
- 3.5 RCU 初始化
- 3.6 中断与时钟初始化
- 3.7 控制台与早期打印
- 3.8 rest_init() — 从内核到用户空间
- 3.9 initcall 机制与驱动初始化
- 4.1 Kbuild 系统概述
- 4.2 bzImage 生成流程
- 4.3 vmlinux、vmlinuz 与 bzImage 的区别
- 4.4 内核链接脚本分析
- 5.1 ARM64 架构概述 —— 寄存器、异常级别与系统寄存器
- 5.2 ARM64 虚拟内存:TTBR0/TTBR1 分割与多级页表
- 5.3 ARM64 异常向量与中断处理
- 5.4 ARM64 内核启动:从 primary_entry 到 start_kernel
- 5.5 ARM64 UEFI 启动与内核映像格式
- 5.6 ARM64 多处理器启动 — PSCI 与 Spin Table
- 5.7 ARM64 安全特性 — PAC、BTI、MTE、KPTI
- 6.1 RISC-V 架构概述:寄存器、特权级与 CSR
- 6.2 RISC-V 虚拟内存:Sv39/Sv48/Sv57 与 SATP
- 6.3 RISC-V 异常与中断处理
- 6.4 RISC-V 内核启动:从 _start 到 start_kernel
- 6.5 RISC-V SBI:Supervisor Binary Interface
- 6.6 RISC-V 多核启动与 HSM
- 6.7 RISC-V 安全特性 —— CFI、Zkr、Svpbmt 与 KASLR
- 6.8 RISC-V 虚拟化 —— H 扩展与 KVM
- 7.1 系统调用原理与分类
- 7.2 x86_64 系统调用 -- SYSCALL/SYSRET 与 MSR
- 7.3 ARM64 系统调用 —— SVC 异常与异常级别切换
- 7.4 RISC-V 系统调用 —— ecall 与特权级切换
- 7.5 系统调用表与参数传递
- 7.6 VDSO 与 vsyscall -- 加速系统调用的用户态捷径
第二部分:进程管理
- 第8章:进程描述符与任务结构
- 8.1 task_struct 核心字段详解
- 8.2 进程状态机 —— TASK_RUNNING 到 TASK_DEAD
- 8.3 进程标识 —— PID、TGID、PGID 与 SID
- 8.4 进程亲属关系与进程组
- 9.1 命名空间概述与设计哲学
- 9.2 PID Namespace —— 进程 ID 隔离
- 9.3 Mount Namespace —— 文件系统视图隔离
- 9.4 Network Namespace —— 网络栈隔离
- 9.5 User Namespace —— 用户身份隔离
- 9.6 UTS、IPC、Cgroup 与 Time Namespace
- 10.1 fork() —— 写时复制的基础
- 10.2 clone() —— 细粒度进程创建
- 10.3 copy_process() 内部实现
- 10.4 写时复制 (COW) 机制详解
- 11.1 Linux 调度器演进史
- 11.2 CFS 完全公平调度器 —— 核心数据结构
- 11.3 EEVDF 调度器 —— Linux 7.0 新默认
- 11.4 实时调度 -- SCHED_FIFO 与 SCHED_RR
- 11.5 SCHED_DEADLINE -- 最早截止时间优先
- 11.6 负载跟踪 -- PELT 与负载均衡
- 12.1 cgroups 演进与 v2 设计哲学
- 12.2 cgroup 核心数据结构与生命周期
- 12.3 CPU 控制器
- 12.4 内存控制器 -- memory cgroup
- 12.5 IO 控制器 -- io cost 与 io weight
- 12.6 cpuset 与设备控制器
- 13.1 上下文切换的触发条件
- 13.2 __schedule() 核心流程
- 13.3 架构相关切换 -- switch_to 宏
- 14.1 进程终止 -- do_exit() 与资源回收
- 14.2 信号机制概述
- 14.3 信号发送 -- kill、sigqueue 与内核信号
- 14.4 信号投递与处理
- 14.5 实时信号与可靠信号
第三部分:内核同步
- 第15章:原子操作、内存屏障与 per-CPU
- 15.1 原子操作 —— atomic_t 与 atomic64_t
- 15.2 内存屏障 —— compiler barrier 与 CPU barrier
- 15.3 per-CPU 变量 —— 无锁共享
- 16.1 自旋锁 —— spinlock_t 与 ticket lock
- 16.2 互斥锁 —— mutex_t 与乐观等待
- 16.3 读写锁与顺序锁
- 17.1 RCU 原理 —— 读侧无锁的优雅方案
- 17.2 RCU 宽限期与回调机制
- 17.3 SRCU 与可睡眠 RCU
- 17.4 completion、fence 与 barrier
第四部分:内存管理
- 第18章:物理内存管理
- 18.1 物理内存布局 —— E820 与 memblock
- 18.2 内存节点 (pg_data_t) 与管理区 (zone)
- 18.3 伙伴系统 (Buddy System)
- 18.4 页帧与 page 结构体
- 19.1 多级页表结构 —— PGD 到 PTE
- 19.2 x86_64 四级/五级页表
- 19.3 ARM64 页表与 Block Mapping
- 19.4 RISC-V Sv39/Sv48/Sv57 页表
- 20.1 内核虚拟地址空间划分
- 20.2 直接映射区 (Direct Mapping)
- 20.3 vmalloc 区域与 vmap
- 20.4 vmemmap 与 fixmap
- 21.1 SLAB/SLUB/SLOB 三代分配器
- 21.2 SLUB 数据结构 —— kmem_cache 与 slab
- 21.3 对象分配与释放流程
- 21.4 per-CPU sheaves 与碎片管理
- 22.1 用户地址空间布局 —— mmap 与栈
- 22.2 VMA (vm_area_struct) 管理
- 22.3 mmap 系统调用与映射类型
- 22.4 页面换入 —— 按需分配与缺页处理
- 23.1 大页原理 —— 减少 TLB 失配
- 23.2 HugeTLB —— 预分配大页
- 23.3 透明大页 (THP) —— 自动大页合并
- 24.1 LRU 链表与页面老化
- 24.2 kswapd 后台回收
- 24.3 直接回收与内存压力
- 25.1 缺页异常入口 —— x86_64 do_page_fault
- 25.2 匿名页与文件页的分配策略
- 25.3 Copy-on-Write 缺页处理
- 25.4 ARM64 与 RISC-V 缺页异常路径对比
第五部分:进程间通信
- 第26章:管道与 FIFO
- 26.1 管道原理与 pipe_inode_info
- 26.2 管道读写与缓冲区管理
- 27.1 信号处理全链路
- 28.1 System V IPC 通用机制 —— ipc_ids 与 kern_ipc_perm
- 28.2 System V 信号量
- 28.3 System V 消息队列
- 30.1 POSIX 共享内存 (shm_open)
- 31.1 futex 原理 —— 快速用户空间互斥
- 31.2 futex 系统调用与内核等待队列
- 32.1 eventfd —— 事件通知机制
- 32.2 timerfd —— 定时器文件描述符
- 32.3 signalfd —— 信号文件描述符
第六部分:文件系统
- 第33章:VFS 框架
- 33.1 VFS 核心对象 —— superblock、inode、dentry、file
- 33.2 文件系统注册与挂载
- 33.3 路径查找 —— namei 与 dcache
- 33.4 文件读写 —— read/write 系统调用路径
- 34.1 Ext4 磁盘布局 —— 块组、inode 表与日志
- 34.2 Ext4 inode 与 extent 树
- 34.3 Ext4 日志 (JBD2)
- 35.1 块设备层架构 —— request_queue 与 bio
- 35.2 I/O 调度器 —— mq-deadline 与 bfq
- 36.1 页缓存 (Page Cache) —— address_space
- 36.2 BIO 结构与提交路径
- 37.1 /proc 文件系统 —— 进程与内核信息
- 37.2 /sys (sysfs) —— 设备与驱动模型导出
- 37.3 debugfs 与 tracefs
- 38.1 OverlayFS 原理与层次结构
- 38.2 OverlayFS 实现 —— upperdir/lowerdir/workdir
- 38.3 OverlayFS 与容器镜像
第七部分:设备驱动
- 第39章:Linux 设备模型
- 39.1 kobject、kset 与 ktype
- 39.2 设备树 (Device Tree) 与 platform_device
- 39.3 sysfs 设备属性导出
- 40.1 字符设备注册 —— register_chrdev
- 40.2 file_operations 与设备文件操作
- 41.1 块设备注册与 gendisk
- 42.1 硬件中断处理 —— 上半部
- 42.2 软中断 (softirq) 与 tasklet
- 42.3 工作队列 (workqueue)
- 42.4 线程化中断 (threaded IRQ)
- 43.1 DMA 原理与 DMA 映射
- 43.2 流式 DMA 映射与一致性 DMA 缓冲区
- 43.3 IOMMU —— 设备地址隔离与翻译
第八部分:网络协议栈
- 第44章:网络子系统架构
- 44.1 网络协议栈分层与 sk_buff
- 44.2 网络设备注册与 net_device
- 45.1 socket 系统调用与 sock 结构
- 45.2 socket 缓冲区管理
- 46.1 IP 层 —— 路由与分片
- 46.2 TCP 连接管理 —— 三次握手与四次挥手
- 46.3 TCP 拥塞控制
- 47.1 Netfilter 钩子与 hook 点
- 47.2 nftables 子系统
- 48.1 Netlink 协议族与消息格式
- 48.2 Netlink 在内核中的应用 —— 路由、SELinux、audit
第九部分:虚拟化
- 第49章:KVM 架构
- 49.1 KVM 模块加载与 /dev/kvm
- 49.2 VMCS (x86) / VTTBR (ARM64) / HGATP (RISC-V)
- 49.3 VM Entry / VM Exit 与世界切换
- 50.1 x86 VT-x / AMD-V 扩展
- 50.2 ARM64 VHE 与嵌套虚拟化
- 51.1 virtio 规范与 virtqueue
- 51.2 virtio 设备实现 —— net、blk、console
- 51.3 Vhost 与 Vhost-VDPA