ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Linux 内核专栏 01】总目录

【Linux 内核专栏 01】总目录 本专题针对已有MCU及简单嵌入式操作系统freertos、ucos等经验的BSP/嵌入式软件工程师 想晋级Linux 内核开发就是把裸机那套机制(启动/trap/MMU/中断/调度),放大到多进程分时 一切皆文件 框架化驱动。缺的不是再读一遍 TLPI,是一张把你的 MCU/RTOS 知识和 Linux 内核模块对齐的骨架。为什么从 MCU 转 Linux 会无从下手你已有的弹药——FreeRTOS等简单实时操作系统 任务/调度/信号量深到 port——全是 Linux 内核的子集概念。但 Linux 把它们做了三件你陌生的事:放大到多进程:你的任务变成千百个进程,调度器从优先级抢占跳到 CFS/EEVDF 公平调度,内存从一个堆跳到每进程独立地址空间 page cache。框架化:你直接写寄存器,Linux 要经 device model / driver framework / VFS / sysfs 五层才碰到硬件。分层切断:用户态/内核态分离,你的main 循环被 syscall 切断成两半,ISR 不能直接做事要推迟到下半部。“无从下手”你知道每块零件,但不知道它们在 Linux 里怎么组装。解药对照法:每个 Linux 概念,先问FreeRTOS里对应什么、Linux 多了什么、为什么多。这里写目录标题一、总图:从 MCU/RTOS 视角辐射二、设计哲学速览(01 详讲)三、16 篇骨架(每篇:定位 / 重点 / 对照锚点 / 深度标尺 / 状态)L1 地基 — 内核怎么跑起来01 心智模型与设计哲学 ⭐02 内核启动流程 ⭐03 进程与调度 ⭐⭐⭐(BSP 核心)04 内存管理 ⭐⭐⭐(BSP 核心)L2 进阶 — 内核的运行机制05 中断与下半部 ⭐⭐(BSP 核心)06 系统调用07 同步与并发 ⭐⭐(BSP 核心)08 时间与定时器L3 驱动核心 — BSP 主场(你的转型目标)09 内核模块与 kbuild ⭐⭐(BSP 核心)10 设备模型 ⭐⭐(BSP 核心)11 驱动框架 ⭐⭐⭐(BSP 主场核心)12 VFS 与文件系统L4 深入 — 选学,触达式13 块 IO 层14 网络协议栈15 电源管理 ⭐16 调试与性能 ⭐四、优先级速查五、学习方法:对照法(治无从下手)5.1 Linux vs FreeRTOS 对照5.2 Linux vs RISC-V bare-metal 对照(刚学完)六、反 stall 提醒七、分篇规划(逐篇建,本表随写随勾)一、总图:从 MCU/RTOS 视角辐射你的已有知识是锚点,Linux 内核是它的放大框架化版本:L4 深入 — 选学,触达式13 块 IO 层bio/request/IO 调度器/blk-mq14 网络协议栈socket/sk_buff/netfilter/网卡框架15 电源管理suspend/runtime PM/cpufreq/cpuidle16 调试与性能ftrace/perf/kprobe/eBPFL3 驱动核心 — BSP 主场09 内核模块与 kbuildLKM/Makefile/Kconfig10 设备模型kobject/kset/bus/driver/device/sysfs11 驱动框架platform/char/misc/file_operations/设备树12 VFS 与文件系统superblock/inode/dentry/fileL2 进阶 — 内核的运行机制05 中断与下半部irq/softirq/tasklet/workqueue06 系统调用syscall/user↔kernel 切换07 同步与并发spinlock/mutex/RCU/percpu08 时间与定时器hrtimer/clocksource/tick/nohzL1 地基 — 内核怎么跑起来01 心智模型与设计哲学宏内核/一切皆文件/机制vs策略02 内核启动流程BootROM→U-Boot→start_kernel→init03 进程与调度task_struct/CFS/EEVDF/上下文切换04 内存管理buddy/slab/缺页/mmap/page cache 你的已有锚点FreeRTOS/ucos port 层 RISC-V/ARM bare-metal BSP二、设计哲学速览(01 详讲)Linux 内核的 7 条设计哲学,每条都对照你的 MCU 经验:哲学一句话你的 MCU 对照宏内核内核是一大块运行在内核态的代码FreeRTOS 也是一坨,但小;Linux 大千万行一切皆文件设备/管道/socket/proc 都是文件MCU 没这层,直接调驱动函数机制与策略分离内核提供机制,策略留给用户态FreeRTOS 调度策略固化在内核可移植性arch/ 层抽象,一套核心跑多架构你移植 FreeRTOS 到 RISC-V 就是 port 层向后兼容不破坏用户态 ABIMCU 固化后 ABI 你也小心(ROM 固化)惰性分配fork 用 COW,内存用到才给MCU 立即分配,没余地惰性进程为中心一切以 task_struct 为单位FreeRTOS 以 TCB 为单位,同构三、16 篇骨架(每篇:定位 / 重点 / 对照锚点 / 深度标尺 / 状态)L1 地基 — 内核怎么跑起来01 心智模型与设计哲学 ⭐定位:整个专题的灵魂,建立 Linux 内核的全景认知。核心重点:宏内核 vs 微内核;一切皆文件(VFS 根基);机制与策略分离;arch 抽象层(对接 RISC-V);惰性分配(COW/lazy);从 MCU/RTOS 视角的四大认知冲击。对照锚点:FreeRTOS 设计哲学、RISC-V 特权架构。深度标尺:30 秒说清Linux 内核是什么、为什么这么设计、和 FreeRTOS 本质差异。02 内核启动流程 ⭐定位:从上电到 init 跑起来,完整链路。核心重点:BootROM → Bootloader(U-Boot/GRUB) → Kernel(解压/head.S) →start_kernel→ init;start_kernel子系统初始化顺序;设备树传递;内核命令行;init 进程(systemd)。对照锚点:[[07-启动与 bare-metal 流程]](RISC-V 启动 5 件事)、Bootloader。深度标尺:能讲清 start_kernel 里 60 init 函数的逻辑分组、能配内核命令行调启动死机。03 进程与调度 ⭐⭐⭐(BSP 核心)定位:Linux 内核的中心数据结构是 task_struct,所有子系统都围绕它。核心重点:task_struct字段全景;进程/线程/内核线程;上下文切换(switch_to,对照 RISC-V trap 切栈);CFS 调度器(vruntime/red-black tree)与EEVDF(新);调度策略(SCHED_NORMAL/FIFO/RR);优先级/nice;抢占点。对照锚点:FreeRTOS TCB/优先级抢占(你的主场)、RISC-V mscratch 切栈。深度标尺:能写一个内核线程、能调调度问题、能解释 CFS vs FreeRTOS 优先级调度的本质差异。04 内存管理 ⭐⭐⭐(BSP 核心)定位:你最大的认知跳变——从一个物理堆到每进程虚拟地址空间 page cache。核心重点:mm_struct/vm_area_struct;Buddy 系统(页分配);Slab/Slub/Slob(对象分配);缺页处理(demand paging);mmap(文件/匿名映射);Page Cache(文件缓存);kmalloc vs vmalloc;DMA 映射(coherent/streaming)。对照锚点:FreeRTOS heap_4、[[06-内存 PMP-MMU-RVWMO]](RISC-V MMU/Sv39)、[[06b-内存架构深挖 PMA-ePMP-Cache-CMO-MMU-RVWMO]]。深度标尺:能选对 kmalloc/vmalloc、能调 OOM、能配 DMA buffer、能解释 page cache 对性能的影响。L2 进阶 — 内核的运行机制05 中断与下半部 ⭐⭐(BSP 核心)定位:你天天配中断,但 Linux 中断架构比裸机复杂得多(顶半部 下半部三选一)。核心重点:中断号抽象(hwirq→virq);中断控制器驱动(GIC/PLIC);顶半部(硬中断,不可睡眠);下半部三件套:softirq(静态,性能)、tasklet(弃用中)、workqueue(可睡眠,常用);threaded irq(中断线程化,现代首选);中断亲和性。对照锚点:[[04-trap 机制详解]]、[[05-中断系统 PLIC-CLINT-AIA]]、FreeRTOS ISR(只能调 FromISR API)。深度标尺:能正确选 softirq/workqueue/threaded irq、能调中断丢失/风暴、能写 threaded irq 驱动。06 系统调用定位:用户态↔内核态的唯一合法通道(Linux 的门)。核心重点:syscall 机制(ecall/syscall 指令,对照 RISC-V ecall);syscall 表;用户态→内核态切换(保存上下文,对照 trap);常见 syscall(open/read/write/mmap/brk/fork);VDSO(免 syscall 的快速路径)。对照锚点:RISC-V ecall(④ trap 讲过)、FreeRTOS 无此层(任务全在内核态)。深度标尺:能跟踪一次 read() 从用户态到内核的完整路径、能用 strace 调试。07 同步与并发 ⭐⭐(BSP 核心)定位:Linux 并发比裸机复杂百倍(SMP 抢占 中断 软中断同时存在)。核心重点:自旋锁(spinlock,SMP 多核忙等,不可睡眠);互斥锁(mutex,可睡眠);信号量(semaphore);RCU(Read-Copy-Update,Linux 独门,读无锁);原子操作(atomic_t);percpu 变量(每核一份,免锁);关抢占/关中断(preempt_disable/local_irq_save);内存屏障(smp_mb/wmb/rmb,对接 [[06b-内存架构深挖 PMA-ePMP-Cache-CMO-MMU-RVWMO]] 的 RVWMO)。对照锚点:FreeRTOS 临界区/信号量/互斥(你的主场)。深度标尺:能选对同步原语(自旋 vs 睡眠)、能读懂 RCU 用法、能定位死锁/竞态。08 时间与定时器定位:定时器从裸机一个 mtimecmp跳到hrtimer clocksource tick nohz多层。核心重点:clocksource(时钟源抽象);clock_event(时钟事件);tick(周期中断,调度心跳);hrtimer(高精度定时器,红黑树);NOHZ(tickless,省电);延时(mdelay/udelay 忙等 vs msleep 睡眠);jiffies vs ktime。对照锚点:FreeRTOS tick(你深到 port 层配 mtimecmp)、[[05-中断系统 PLIC-CLINT-AIA]] 的 CLINT mtime。深度标尺:能写 hrtimer 驱动、能配 NOHZ、能解释 FreeRTOS tick 和 Linux tick 的差异。L3 驱动核心 — BSP 主场(你的转型目标)09 内核模块与 kbuild ⭐⭐(BSP 核心)定位:你写驱动的入口,天天用。核心重点:模块机制(LKM,动态加载/卸载);module_init/module_exit;kbuild(Makefile/Kconfig/Kbuild);模块符号导出(EXPORT_SYMBOL);模块参数;模块依赖;insmod/rmmod/modprobe;模块 vs 内建;签名与安全加载。对照锚点:你懂静态链接([[09-工具链深挖 relaxation-ELF]]),模块是运行时链接。深度标尺:能写完整模块 Makefile、能调模块加载失败、能用模块参数配置驱动。10 设备模型 ⭐⭐(BSP 核心)定位:Linux 驱动框架的地基,不理解设备模型就读不懂任何框架。核心重点:kobject/kset(对象层级);bus/driver/device三角关系;sysfs(设备树在用户态的投影);udev/mdev(用户态设备节点管理);设备引用计数(kref);热插拔(uevent)。对照锚点:MCU 没这层(直接 struct),这是 Linux 的OO 框架。深度标尺:能读懂 sysfs 结构、能解释 driver probe 怎么被触发、能调设备绑定问题。11 驱动框架 ⭐⭐⭐(BSP 主场核心)定位:你写驱动的主战场,platform/char/misc 三大框架 设备树。核心重点:platform 驱动(嵌入式无总线设备主力,probe/remove);字符设备(cdev/file_operations,open/read/write/ioctl);misc 驱动(简化字符设备);设备树(DTS,硬件描述,取代板级代码);file_operations 全表(open/release/read/write/ioctl/mmap/poll);并发与错误处理在驱动里怎么写。对照锚点:你写过的裸机 UART/SPI/I2C 驱动(直接寄存器)→ Linux 版要包框架。深度标尺:能从零写一个 platform 字符设备驱动 设备树节点、能用 poll 实现非阻塞、能调 probe 失败。12 VFS 与文件系统定位:一切皆文件的实现层,所有设备节点最终落 VFS。核心重点:VFS 四对象(superblock/inode/dentry/file);file_operations(和字符设备共用);挂载(mount);procfs/sysfs/debugfs(内核信息出口);ext4 概念(不深挖,知道布局);页缓存(对接 04)。对照锚点:MCU 无文件系统(你用 struct 直接访问),Linux 一切经 VFS。深度标尺:能读懂 open()→VFS→驱动 read 的完整路径、能用 debugfs 导出调试信息。L4 深入 — 选学,触达式13 块 IO 层定位:存储驱动(EMMC/NVMe/SATA)的地基,做存储驱动必学。核心重点:bio(块 IO 请求);request_queue;IO 调度器(mq-deadline/bfq/kyber);blk-mq(多队列,现代);page cache 交互(对接 04)。对照锚点:你 UART DMA linklist(类似批量传输)。深度标尺:能读懂块设备驱动框架、能解释 IO 调度器对延迟的影响。14 网络协议栈定位:网络驱动/socket 的地基,Linux 的强项。核心重点:sk_buff(网络包核心结构);网络层(socket/sock);netfilter(iptables 钩子);网卡驱动框架(net_device/napi);协议栈分层(L2→L4)。对照锚点:MCU lwIP(你可能用过)。深度标尺:能读懂网卡驱动 napi 轮询、能用 netfilter 做包过滤。15 电源管理 ⭐定位:嵌入式/移动设备必学,你的 AEGIX 功能安全芯片也要低功耗。核心重点:suspend/hibernate(系统级睡眠);Runtime PM(设备级,空闲即睡);cpufreq(动态频率);cpuidle(空闲状态);PM QoS(延迟要求);wakeup source(唤醒源);驱动 PM 回调(suspend/resume)。对照锚点:FreeRTOS tickless idle、RISC-V WFI。深度标尺:能给驱动加 Runtime PM、能调 suspend 死机、能配 cpufreq 调频。16 调试与性能 ⭐定位:你 gdb stat_snap 的延伸,Linux 有更强工具链。核心重点:printk(分级日志);ftrace(函数追踪,神器);perf(性能剖析,对接你 stat_snap);kprobe/kretprobe(动态探针);eBPF(现代可编程追踪);/proc/meminfo|cpuinfo;crash dump(死机分析,对接你的死机五步法);lockdep(锁依赖检测)。对照锚点:[[10-调试与性能计数器]](你 stat_snap)、[[ARM vs RISC-V 栈回溯技术]]。深度标尺:能用 ftrace 定位函数调用链、能用 perf 找热点、能用 eBPF 做自定义追踪。四、优先级速查级别模块触发时机⭐⭐⭐ 立即03 进程调度 / 04 内存内核中心数据结构,先建⭐⭐⭐ BSP 主场11 驱动框架你转型目标的核心⭐⭐ 立即01 哲学 / 02 启动 / 05 中断 / 07 同步 / 09 模块 / 10 设备模型地基驱动框架⭐ 延后06 syscall / 08 时间 / 12 VFS / 15 电源 / 16 调试触达式填选学13 块IO / 14 网络做对应驱动时五、学习方法:对照法(治无从下手)5.1 Linux vs FreeRTOS 对照概念FreeRTOSLinux差异本质任务单位TCBtask_structLinux 大得多(含 mm/fs/files)调度优先级抢占CFS/EEVDF 公平Linux 不靠优先级靠虚拟时间栈每任务独立栈,你定大小内核栈 8/16KB 固定 用户栈Linux 内核栈小,不能深递归中断 ISRFromISR API顶半部 下半部Linux 推迟到可睡眠上下文信号量二值/计数semaphore(可睡眠)同名但 Linux 能睡互斥Mutex(优先级继承)mutex(可睡,有 debug)都有优先级继承临界区关中断自旋锁/关抢占Linux 多核要自旋堆heap_4 等几种buddyslabkmallocLinux 分层分配tickmtimecmp 配hrtimerticknohzLinux 高精度省电5.2 Linux vs RISC-V bare-metal 对照(刚学完)概念RISC-V bare-metalLinux差异本质特权M/S/U 你在 M内核在 S,用户在 ULinux 用 S 态,不用 Mtrap你写 trap entry内核 trap_init 接管Linux 框架化中断PLIC 直接配irq_domain 框架Linux 抽象 hwirq→virqMMUsatp 你可配可不配必用,每进程页表Linux 依赖 MMU启动BootROM→BL→_startBootROM→U-Boot→start_kernel→initLinux 多了 init 进程设备描述C 结构体/宏设备树 DTSLinux 运行时解析硬件双对照是你学 Linux 的加速器每读一个 Linux 概念,先在脑子里找 FreeRTOS/RISC-V 对应物,再看 Linux 多了什么、为什么多。你的知识不是白学,是 Linux 的子集——这个认知能消除无从下手的恐慌。六、反 stall 提醒[!warning] 这专题和 [[Linux-BSP驱动进阶22周计划-方案B]] 不抢时间,是互补本专题:知识底盘,系统化整理 Linux 内核模块,让你懂为什么。22 周计划:项目驱动,在 Pi5 上写驱动,让你会动手。两者是理论 实践关系,不冲突。判断标准:本专题建好后,你做 22 周计划的 lab 时,有多少次回来查专题。没查专题空谈在 stall;常查专题在工作。别把本专题当读完才动手的前置——边写驱动边回查才是正道。七、分篇规划(逐篇建,本表随写随勾)16 篇按顺序写,每篇统一结构:定位 / 重点 / 对照锚点 / 深度标尺 / 嵌入式视角 callout / 对照表 / 速查表 / 相关笔记 wikilink。每篇贴合你的 BSP 转型背景。[[01-Linux内核心智模型与设计哲学]] —— 宏内核/一切皆文件/机制vs策略/arch抽象/惰性分配/进程为中心/四大认知冲击[[02-内核启动流程]] —— BootROM→U-Boot→head.S→start_kernel→init;initcall;设备树;cmdline;多核启动[[03-进程管理与调度]] —— task_struct全景/状态/上下文切换/CFSEEVDF/调度策略/抢占/fork-exec-wait[[04-内存管理]] —— mm_struct/VMA/Buddy/Slab/kmalloc vs vmalloc/缺页/mmap/Page Cache/DMA/OOM[[05-中断与下半部]] —— irq_domain/irqchip/顶半部约束/softirq-tasklet-workqueue/threaded irq/亲和性[[06-系统调用]] —— ecall机制/syscall表/read完整路径/pt_regs/VDSO/strace/copy_to-from_user[[07-同步与并发]] —— spinlock变种/mutex/semaphore/atomic/RCU/percpu/关抢占关中断/内存屏障/lockdep[[08-时间与定时器]] —— clocksource/clock_event/tick/hrtimer/timer_list/jiffies vs ktime/udelay vs msleep/NOHZ[[09-内核模块与 kbuild]] —— LKM/module_init-exit/Makefile/加载流程/EXPORT_SYMBOL/module_param/Kconfig[[10-设备模型]] —— kobject/kref/kset/device/device_driver/bus_type/class/sysfs/ueventudev[[11-驱动框架 platform-char-misc-设备树]] —— platform骨架/字符设备cdev/file_operations全表/misc/ioctl/poll/mmap/devm_/设备树DTS[[12-VFS 与文件系统]] —— VFS四对象(superblock/inode/dentry/file)/挂载/路径查找/procfs-sysfs-debugfs/ext4[[13-块 IO 层]] —— bio/request/request_queue/IO调度器/blk-mq/块驱动gendisk/iostat[[14-网络协议栈]] —— socket/sk_buff/net_device/NAPI/netfilter五钩子/路由/TSO-GSO-RSS-XDP[[15-电源管理]] —— cpuidle/cpufreqgovernor/Runtime PM/suspend/wakeup source/clock-regulator framework[[16-调试与性能]] —— printk/oops五步法addr2line/ftrace/perf火焰图/kprobe/eBPFbpftrace/lockdep/kgdb/sysrq技术之路漫漫分享是为了更好地交流。如果本文的内容对你有启发希望能得到你的点赞 和收藏 ⭐。如果你在调试过程中遇到了其他问题欢迎在评论区 留言我们一起探讨。也欢迎关注 我一起交流底层开发的那些事儿。
返回列表