Linux 内核整体架构完整详解
核心概念 Linux 内核整体架构涵盖进程管理、内存管理、文件系统、网络协议栈、设备驱动等核心子系统。
1. 总览:Linux 内核分层模型
现代 Linux 内核采用宏内核(Monolithic Kernel) 架构,但通过模块化、分层解耦优化,并非早期一锅烩的粗粒度宏内核;同时区分内核态(Ring0) / 用户态(Ring3) 两大运行空间。
整体自上而下分为 5 大层级,依赖关系单向:上层依赖下层,下层不感知上层:
- 用户空间(User Space):应用、glibc、命令行程序(不属于内核,但交互入口)
- 系统调用接口层(Syscall Interface):用户态进入内核唯一标准入口
- 内核核心子系统层(五大核心:进程调度、内存管理、VFS虚拟文件系统、网络协议栈、IPC进程通信)
- 设备驱动层 & 内核模块:硬件抽象、外设驱动、中断处理
- 硬件架构抽象层(Arch 架构相关代码):CPU、MMU、寄存器、汇编底层适配 整体架构简图:
用户程序(bash/nginx/mysql/python) ←→ glibc标准库
↓↑(系统调用 syscall / int 0x80)
【系统调用接口层】
↓↑
┌─────┬─────┬─────┬─────┬─────┐
│进程调度│内存管理│VFS文件系统│网络栈│IPC通信│ 五大核心子系统
└─────┴─────┴─────┴─────┴─────┘
↓↑(统一设备抽象接口)
【设备驱动层 + 内核模块】块设备/字符设备/网卡驱动/中断
↓↑
【Arch硬件抽象层】x86_64/arm64 riscv CPU、MMU、页表、中断控制器
↓↑
物理硬件:CPU、内存、磁盘、网卡、外设
1.1. 核心设计思想
- 硬件抽象层统一屏蔽CPU差异:一套内核代码跨 x86_64/ARM64/RISC-V;
- VFS 虚拟文件系统统一所有文件/设备接口:磁盘、socket、pipe、proc、dev 全部以文件操作统一访问;
- 模块化设计:驱动可编译为
.ko动态模块,不用重新编译整个内核; - 统一系统调用入口:所有用户操作内核资源必须走 syscall,安全隔离;
- 内核态两种上下文:进程上下文(系统调用,可睡眠)、中断上下文(硬件中断,禁止睡眠)。
2. 第一层:用户空间(不属于内核,交互边界)
2.1. 组成
- 各类应用程序:Nginx、MySQL、Python、Java、shell 脚本、运维工具
- C标准库 glibc:封装
open/read/write/socket/fork,底层封装syscall汇编指令触发系统调用
2.2. 关键特性
- 运行在 Ring3 用户态,权限受限,不能直接操作硬件、访问内核内存;
- 每个进程拥有独立虚拟用户地址空间,进程间天然隔离;
- 无权限直接执行特权指令、修改页表、操作中断控制器。
2.3. 和内核交互唯一通道:系统调用
应用不能直接调用内核函数,必须通过 syscall 陷入内核态。
3. 第二层:系统调用接口层(Syscall Interface)
用户态与内核的标准隔离边界,是整个内核对外暴露的唯一API。
3.1. 作用
- 接收用户态请求,根据系统调用号分发到对应内核函数(
sys_open、sys_read、sys_fork、sys_socket); - 完成上下文切换:保存用户寄存器、切换内核栈、进入Ring0;
- 调用完成后将执行结果、错误码返回用户态,恢复用户上下文。
3.2. x86_64 实现方式
- 64位:
syscall / sysret高速指令(主流) - 32位兼容:
int 0x80软中断
3.3. 典型系统调用分类
- 进程管理:fork、exec、exit、wait、setpriority
- 文件IO:open、read、write、close、stat、mmap
- 内存管理:brk、mmap、munmap这无所谓啊试一下看一下上面应该没上面还是有啊我操这么坑的吗不是哎不对不对他不一样他是他不是是不是你
- 网络:socket、bind、listen、connect、send/recv
- 进程通信:pipe、shmget、msgget、semget
- 信号:kill、signal、rt_sigaction
3.4. 观测工具
strace 程序:捕获进程全部系统调用,运维排查底层IO、阻塞神器。
4. 第三层:内核五大核心子系统(内核主体,核心逻辑)
4.1. 子系统1:进程调度器(Scheduler)——CPU资源管理者
负责多进程/多线程并发,分配CPU时间片,决定下一个运行任务。
4.1.1. 核心数据结构
struct task_struct:进程/线程完整描述符,存放PID、状态、内存指针、文件描述符、调度策略、优先级、内核栈、信号、CPU亲和性。
进程状态:R运行、S可中断睡眠、D不可中断睡眠、T停止、Z僵尸。
4.1.2. CFS 完全公平调度器(Linux 默认)
- 核心思想:所有普通进程按权重公平分配CPU时间;
- 虚拟运行时间 vruntime:任务越久没运行,vruntime 越小,优先调度;
- 调度实体存放红黑树,快速选取最小vruntime进程;
- 支持nice动态调整权重、CPU绑核、实时调度SCHED_FIFO/SCHED_RR。
4.1.3. 调度场景
- 主动调度:进程调用sleep、阻塞IO、互斥锁,主动让出CPU;
- 被动抢占调度:时钟硬中断触发,时间片耗尽;高优先级任务唤醒抢占低优先级进程。
4.1.4. 运维对应观测
ps / top / htop 读取task_struct;/proc/[pid]/sched 调度详情;/proc/sched_debug 调度队列。
4.2. 子系统2:内存管理子系统(MM)——虚拟/物理内存管理
管理物理内存、虚拟地址空间、页表、缓存、交换分区swap,隔离进程内存。
4.2.1. 核心机制
- 虚拟内存地址空间隔离
每个进程独立虚拟地址:低地址用户空间,高地址全局共享内核空间;MMU硬件通过页表完成虚拟→物理地址转换。 - 页 Page 最小内存单位
内存按4K/2M/1G大页划分,struct page 描述物理页; - 页缓存 PageCache
文件读写缓存,减少磁盘IO;writeback后台线程刷脏页到磁盘(pdflush); - Slab/Slub/Slob 内存分配器
内核小块内存分配(task_struct、socket、inode 等内核对象);用户态大块内存用brk/mmap; - OOM 机制
物理内存耗尽触发OOM killer,按分数杀死占用内存最高进程; - Swap 交换分区
内存不足时将冷页置换到磁盘,vm.swappiness控制置换倾向。
4.2.2. 关键文件与参数
/proc/meminfo、/proc/vmstat、/proc/sys/vm/*;
/proc/[pid]/maps / smaps 进程虚拟内存布局。
4.3. 子系统3:VFS 虚拟文件系统(Virtual File System)
Linux 最核心抽象之一,统一所有IO资源接口,万物皆文件。
4.3.1. 核心目标
屏蔽不同文件系统(ext4/xfs/btrfs)、特殊文件(socket、pipe、字符设备、proc、sysfs)差异,用户统一使用 open/read/write。
4.3.2. 四大核心抽象对象
super_block:文件系统超级块,代表一个挂载分区;inode:文件元数据(大小、权限、块位置,不包含文件名);dentry:目录项,文件名与inode映射,目录缓存加速查找;file:进程打开的文件句柄,存放读写偏移、操作函数集。
4.3.3. 内置特殊文件系统(纯内核内存,无磁盘)
- proc:进程、内核实时信息
/proc(/proc/interrupts、/proc/meminfo) - sysfs:硬件设备、内核参数结构化输出
/sys - tmpfs:内存临时文件系统 /dev/shm
- pipefs:管道、socketfs网络套接字
4.3.4. 磁盘文件系统
ext4、XFS、btrfs、ntfs、fat32;所有块设备读写统一经过VFS层下发块设备驱动。
4.4. 子系统4:网络协议栈(Network Stack)
分层TCP/IP完整实现,自下而上:设备层→链路层→IP层→传输层(TCP/UDP)→Socket API。
4.4.1. 分层结构
- 设备驱动层:网卡驱动收发报文;
- 链路层:ARP、VLAN、桥接bridge;
- 网络层:IP路由、netfilter iptables/nftables、conntrack连接跟踪;
- 传输层:TCP拥塞控制、滑动窗口、重传、半同步;UDP无连接;
- Socket层:VFS兼容,socket也是file,统一read/write操作。
4.4.2. 核心组件
- sk_buff:网络报文缓冲区,存放数据包所有分层头部;
- TCP拥塞算法:cubic(默认)、bbr、reno;
- Netfilter:内核防火墙、NAT、流量转发、连接跟踪;
- 软中断softirq:网卡收包延后处理,对应
/proc/softirqsNET_RX。
4.4.3. 观测工具
ss、ip、tcpdump、nstat、/proc/net/tcp、/proc/net/dev。
4.5. 子系统5:IPC 进程间通信子系统
提供同一主机多进程数据交换能力,全部依托VFS抽象:
- 匿名管道 pipe / 命名管道 fifo
- 共享内存 shm(最快IPC,直接共享物理页)
- 消息队列 msg
- 信号量 sem(进程互斥同步)
- Unix域套接字 AF_UNIX(本地高性能socket)
5. 第四层:设备驱动层 & 内核模块
内核和硬件的中间适配层,所有外设(磁盘、网卡、串口、GPU)逻辑实现。
5.1. 设备三大分类(统一VFS文件接口)
- 字符设备:字节流顺序读写,串口、终端、鼠标、/dev/null;
- 块设备:按块随机读写,磁盘分区 /dev/sda;有页缓存;
- 网络设备:特殊设备,不走标准read/write,通过socket收发报文。
5.2. 内核模块 .ko
内核支持动态加载卸载驱动模块,无需重启、不用重编内核:
insmod/rmmod/lsmod modinfo
优点:减小内核镜像体积,按需加载硬件驱动。
5.3. 中断与软中断机制
- 硬中断 IRQ:硬件触发,中断上下文,快速处理极简逻辑;
- 软中断 softirq:耗时任务延后执行(网卡收包、磁盘IO完成);
- work_queue 工作队列:把中断上下文任务迁移到进程上下文,允许睡眠。
6. 第五层:Arch 硬件架构抽象层
内核最底层,屏蔽不同CPU架构指令集、寄存器、MMU、中断控制器差异。
目录 arch/ 下分:x86_64、arm64、riscv、mips 等。
6.1. 核心工作
- CPU 汇编底层:系统调用入口、上下文切换、异常处理;
- MMU 页表创建、虚拟内存映射;
- 硬件中断控制器APIC/GIC适配;
- 时钟、CPU启停、缓存刷新架构相关逻辑。
上层五大子系统完全不依赖该层硬件细节,实现跨CPU架构移植。
7. 内核两种运行上下文(高频面试重点)
7.1. 进程上下文
触发方式:用户态调用系统调用进入内核;
绑定:归属发起调用的进程,有task_struct;
特性:
- 可访问当前进程用户空间内存;
- 允许睡眠、等待IO、获取互斥锁;
- 有完整信号、文件描述符、PID资源。
7.2. 中断上下文
触发方式:硬件硬中断、软中断;
绑定:不归属任何进程,无task_struct;
硬性限制:
- 禁止睡眠、禁止调用阻塞函数;
- 不能访问用户空间;
- 内核栈极小,禁止深层递归。
8. 内核整体执行数据流示例(读取文件 read 完整链路)
- 用户程序调用 fread() → glibc 封装 syscall 指令,进入内核态;
- 系统调用分发到
sys_read(系统调用层); - sys_read 调用VFS层 file->read 函数;
- VFS 检查页缓存 PageCache:
- 命中缓存:直接拷贝页缓存数据到用户缓冲区,返回;
- 未命中:下发块设备驱动,发起磁盘IO;
- 磁盘硬件完成IO,触发硬中断,中断上下文将数据写入PageCache;
- 回到进程上下文,拷贝数据到用户空间;
- 系统调用执行完毕,切回用户态,程序拿到文件内容。
9. 内核 vs 用户态 关键全局约束总结
- 用户态无法直接访问硬件、内核内存、执行特权指令;
- 所有资源操作必须经过系统调用陷入内核;
- 内核态拥有全部硬件权限,但内核崩溃直接整机panic;
- 内核通过五大子系统统一调度CPU、内存、磁盘、网络、进程通信;
- VFS是统一抽象,所有资源都可当作文件操作,是Linux设计精髓;
- 中断上下文禁止睡眠,进程上下文可正常阻塞等待资源。
10. 运维视角对应观测入口(架构落地排查)
| | | |
|---|---|---|
|内核子系统|查看文件/工具|作用|
|进程调度|top/htop /proc/[pid]/sched /proc/sched_debug|进程状态、CPU调度、抢占、D进程|
|内存管理|/proc/meminfo /vmstat /proc/[pid]/smaps|内存占用、缓存、OOM、swap|
|VFS文件系统|mount /df -h /proc/filesystems|挂载点、文件系统类型、inode占用|
|网络栈|ss ip /proc/net/tcp /softirqs|TCP连接、流量、网卡软中断开销|
|中断驱动|/proc/interrupts /proc/softirqs|硬件中断、网卡磁盘中断负载|
|系统调用|strace|追踪程序所有内核交互操作|
11. 面试速记核心要点
- Linux 宏内核分层架构:用户态 → 系统调用层 → 五大核心子系统 → 驱动模块 → Arch硬件层;
- 五大核心子系统:进程调度CFS、内存管理(PageCache/Slab/OOM)、VFS虚拟文件系统、TCP/IP网络栈、IPC进程通信;
- VFS核心四大结构 super_block / inode / dentry / file,实现万物皆文件;
- 内核两种上下文:进程上下文(系统调用,可睡眠)、中断上下文(硬件触发,禁止睡眠);
- 用户态只能通过syscall进入内核,硬件、内核内存完全隔离;
- 驱动分为字符/块/网络设备,可编译为.ko动态内核模块;
- 网络栈依托Netfilter实现防火墙NAT,收包逻辑运行在软中断;
- PageCache内核页缓存大幅降低磁盘IO,pdflush线程后台刷脏页。
关联文档