核專欄 01】總目錄)
本專題針對(duì)已有MCU及簡(jiǎn)單嵌入式操作系統(tǒng)freertos、ucos等經(jīng)驗(yàn)的BSP/嵌入式軟件工程師 想晉級(jí)Linux 內(nèi)核開(kāi)發(fā)就是把裸機(jī)那套機(jī)制(啟動(dòng)/trap/MMU/中斷/調(diào)度),放大到多進(jìn)程分時(shí) 一切皆文件 框架化驅(qū)動(dòng)。缺的不是再讀一遍 TLPI,是一張把你的 MCU/RTOS 知識(shí)和 Linux 內(nèi)核模塊對(duì)齊的骨架。為什么從 MCU 轉(zhuǎn) Linux 會(huì)無(wú)從下手你已有的彈藥——FreeRTOS等簡(jiǎn)單實(shí)時(shí)操作系統(tǒng) 任務(wù)/調(diào)度/信號(hào)量深到 port——全是 Linux 內(nèi)核的子集概念。但 Linux 把它們做了三件你陌生的事:放大到多進(jìn)程:你的任務(wù)變成千百個(gè)進(jìn)程,調(diào)度器從優(yōu)先級(jí)搶占跳到 CFS/EEVDF 公平調(diào)度,內(nèi)存從一個(gè)堆跳到每進(jìn)程獨(dú)立地址空間 page cache??蚣芑?你直接寫(xiě)寄存器,Linux 要經(jīng) device model / driver framework / VFS / sysfs 五層才碰到硬件。分層切斷:用戶態(tài)/內(nèi)核態(tài)分離,你的main 循環(huán)被 syscall 切斷成兩半,ISR 不能直接做事要推遲到下半部?!盁o(wú)從下手”你知道每塊零件,但不知道它們?cè)?Linux 里怎么組裝。解藥對(duì)照法:每個(gè) Linux 概念,先問(wèn)FreeRTOS里對(duì)應(yīng)什么、Linux 多了什么、為什么多。這里寫(xiě)目錄標(biāo)題一、總圖:從 MCU/RTOS 視角輻射二、設(shè)計(jì)哲學(xué)速覽(01 詳講)三、16 篇骨架(每篇:定位 / 重點(diǎn) / 對(duì)照錨點(diǎn) / 深度標(biāo)尺 / 狀態(tài))L1 地基 — 內(nèi)核怎么跑起來(lái)01 心智模型與設(shè)計(jì)哲學(xué) ?02 內(nèi)核啟動(dòng)流程 ?03 進(jìn)程與調(diào)度 ???(BSP 核心)04 內(nèi)存管理 ???(BSP 核心)L2 進(jìn)階 — 內(nèi)核的運(yùn)行機(jī)制05 中斷與下半部 ??(BSP 核心)06 系統(tǒng)調(diào)用07 同步與并發(fā) ??(BSP 核心)08 時(shí)間與定時(shí)器L3 驅(qū)動(dòng)核心 — BSP 主場(chǎng)(你的轉(zhuǎn)型目標(biāo))09 內(nèi)核模塊與 kbuild ??(BSP 核心)10 設(shè)備模型 ??(BSP 核心)11 驅(qū)動(dòng)框架 ???(BSP 主場(chǎng)核心)12 VFS 與文件系統(tǒng)L4 深入 — 選學(xué),觸達(dá)式13 塊 IO 層14 網(wǎng)絡(luò)協(xié)議棧15 電源管理 ?16 調(diào)試與性能 ?四、優(yōu)先級(jí)速查五、學(xué)習(xí)方法:對(duì)照法(治無(wú)從下手)5.1 Linux vs FreeRTOS 對(duì)照5.2 Linux vs RISC-V bare-metal 對(duì)照(剛學(xué)完)六、反 stall 提醒七、分篇規(guī)劃(逐篇建,本表隨寫(xiě)隨勾)一、總圖:從 MCU/RTOS 視角輻射你的已有知識(shí)是錨點(diǎn),Linux 內(nèi)核是它的放大框架化版本:L4 深入 — 選學(xué),觸達(dá)式13 塊 IO 層bio/request/IO 調(diào)度器/blk-mq14 網(wǎng)絡(luò)協(xié)議棧socket/sk_buff/netfilter/網(wǎng)卡框架15 電源管理suspend/runtime PM/cpufreq/cpuidle16 調(diào)試與性能ftrace/perf/kprobe/eBPFL3 驅(qū)動(dòng)核心 — BSP 主場(chǎng)09 內(nèi)核模塊與 kbuildLKM/Makefile/Kconfig10 設(shè)備模型kobject/kset/bus/driver/device/sysfs11 驅(qū)動(dòng)框架platform/char/misc/file_operations/設(shè)備樹(shù)12 VFS 與文件系統(tǒng)superblock/inode/dentry/fileL2 進(jìn)階 — 內(nèi)核的運(yùn)行機(jī)制05 中斷與下半部irq/softirq/tasklet/workqueue06 系統(tǒng)調(diào)用syscall/user?kernel 切換07 同步與并發(fā)spinlock/mutex/RCU/percpu08 時(shí)間與定時(shí)器hrtimer/clocksource/tick/nohzL1 地基 — 內(nèi)核怎么跑起來(lái)01 心智模型與設(shè)計(jì)哲學(xué)宏內(nèi)核/一切皆文件/機(jī)制vs策略02 內(nèi)核啟動(dòng)流程BootROM→U-Boot→start_kernel→init03 進(jìn)程與調(diào)度task_struct/CFS/EEVDF/上下文切換04 內(nèi)存管理buddy/slab/缺頁(yè)/mmap/page cache 你的已有錨點(diǎn)FreeRTOS/ucos port 層 RISC-V/ARM bare-metal BSP二、設(shè)計(jì)哲學(xué)速覽(01 詳講)Linux 內(nèi)核的 7 條設(shè)計(jì)哲學(xué),每條都對(duì)照你的 MCU 經(jīng)驗(yàn):哲學(xué)一句話你的 MCU 對(duì)照宏內(nèi)核內(nèi)核是一大塊運(yùn)行在內(nèi)核態(tài)的代碼FreeRTOS 也是一坨,但小;Linux 大千萬(wàn)行一切皆文件設(shè)備/管道/socket/proc 都是文件MCU 沒(méi)這層,直接調(diào)驅(qū)動(dòng)函數(shù)機(jī)制與策略分離內(nèi)核提供機(jī)制,策略留給用戶態(tài)FreeRTOS 調(diào)度策略固化在內(nèi)核可移植性arch/ 層抽象,一套核心跑多架構(gòu)你移植 FreeRTOS 到 RISC-V 就是 port 層向后兼容不破壞用戶態(tài) ABIMCU 固化后 ABI 你也小心(ROM 固化)惰性分配fork 用 COW,內(nèi)存用到才給MCU 立即分配,沒(méi)余地惰性進(jìn)程為中心一切以 task_struct 為單位FreeRTOS 以 TCB 為單位,同構(gòu)三、16 篇骨架(每篇:定位 / 重點(diǎn) / 對(duì)照錨點(diǎn) / 深度標(biāo)尺 / 狀態(tài))L1 地基 — 內(nèi)核怎么跑起來(lái)01 心智模型與設(shè)計(jì)哲學(xué) ?定位:整個(gè)專題的靈魂,建立 Linux 內(nèi)核的全景認(rèn)知。核心重點(diǎn):宏內(nèi)核 vs 微內(nèi)核;一切皆文件(VFS 根基);機(jī)制與策略分離;arch 抽象層(對(duì)接 RISC-V);惰性分配(COW/lazy);從 MCU/RTOS 視角的四大認(rèn)知沖擊。對(duì)照錨點(diǎn):FreeRTOS 設(shè)計(jì)哲學(xué)、RISC-V 特權(quán)架構(gòu)。深度標(biāo)尺:30 秒說(shuō)清Linux 內(nèi)核是什么、為什么這么設(shè)計(jì)、和 FreeRTOS 本質(zhì)差異。02 內(nèi)核啟動(dòng)流程 ?定位:從上電到 init 跑起來(lái),完整鏈路。核心重點(diǎn):BootROM → Bootloader(U-Boot/GRUB) → Kernel(解壓/head.S) →start_kernel→ init;start_kernel子系統(tǒng)初始化順序;設(shè)備樹(shù)傳遞;內(nèi)核命令行;init 進(jìn)程(systemd)。對(duì)照錨點(diǎn):[[07-啟動(dòng)與 bare-metal 流程]](RISC-V 啟動(dòng) 5 件事)、Bootloader。深度標(biāo)尺:能講清 start_kernel 里 60 init 函數(shù)的邏輯分組、能配內(nèi)核命令行調(diào)啟動(dòng)死機(jī)。03 進(jìn)程與調(diào)度 ???(BSP 核心)定位:Linux 內(nèi)核的中心數(shù)據(jù)結(jié)構(gòu)是 task_struct,所有子系統(tǒng)都圍繞它。核心重點(diǎn):task_struct字段全景;進(jìn)程/線程/內(nèi)核線程;上下文切換(switch_to,對(duì)照 RISC-V trap 切棧);CFS 調(diào)度器(vruntime/red-black tree)與EEVDF(新);調(diào)度策略(SCHED_NORMAL/FIFO/RR);優(yōu)先級(jí)/nice;搶占點(diǎn)。對(duì)照錨點(diǎn):FreeRTOS TCB/優(yōu)先級(jí)搶占(你的主場(chǎng))、RISC-V mscratch 切棧。深度標(biāo)尺:能寫(xiě)一個(gè)內(nèi)核線程、能調(diào)調(diào)度問(wèn)題、能解釋 CFS vs FreeRTOS 優(yōu)先級(jí)調(diào)度的本質(zhì)差異。04 內(nèi)存管理 ???(BSP 核心)定位:你最大的認(rèn)知跳變——從一個(gè)物理堆到每進(jìn)程虛擬地址空間 page cache。核心重點(diǎn):mm_struct/vm_area_struct;Buddy 系統(tǒng)(頁(yè)分配);Slab/Slub/Slob(對(duì)象分配);缺頁(yè)處理(demand paging);mmap(文件/匿名映射);Page Cache(文件緩存);kmalloc vs vmalloc;DMA 映射(coherent/streaming)。對(duì)照錨點(diǎn):FreeRTOS heap_4、[[06-內(nèi)存 PMP-MMU-RVWMO]](RISC-V MMU/Sv39)、[[06b-內(nèi)存架構(gòu)深挖 PMA-ePMP-Cache-CMO-MMU-RVWMO]]。深度標(biāo)尺:能選對(duì) kmalloc/vmalloc、能調(diào) OOM、能配 DMA buffer、能解釋 page cache 對(duì)性能的影響。L2 進(jìn)階 — 內(nèi)核的運(yùn)行機(jī)制05 中斷與下半部 ??(BSP 核心)定位:你天天配中斷,但 Linux 中斷架構(gòu)比裸機(jī)復(fù)雜得多(頂半部 下半部三選一)。核心重點(diǎn):中斷號(hào)抽象(hwirq→virq);中斷控制器驅(qū)動(dòng)(GIC/PLIC);頂半部(硬中斷,不可睡眠);下半部三件套:softirq(靜態(tài),性能)、tasklet(棄用中)、workqueue(可睡眠,常用);threaded irq(中斷線程化,現(xiàn)代首選);中斷親和性。對(duì)照錨點(diǎn):[[04-trap 機(jī)制詳解]]、[[05-中斷系統(tǒng) PLIC-CLINT-AIA]]、FreeRTOS ISR(只能調(diào) FromISR API)。深度標(biāo)尺:能正確選 softirq/workqueue/threaded irq、能調(diào)中斷丟失/風(fēng)暴、能寫(xiě) threaded irq 驅(qū)動(dòng)。06 系統(tǒng)調(diào)用定位:用戶態(tài)?內(nèi)核態(tài)的唯一合法通道(Linux 的門)。核心重點(diǎn):syscall 機(jī)制(ecall/syscall 指令,對(duì)照 RISC-V ecall);syscall 表;用戶態(tài)→內(nèi)核態(tài)切換(保存上下文,對(duì)照 trap);常見(jiàn) syscall(open/read/write/mmap/brk/fork);VDSO(免 syscall 的快速路徑)。對(duì)照錨點(diǎn):RISC-V ecall(④ trap 講過(guò))、FreeRTOS 無(wú)此層(任務(wù)全在內(nèi)核態(tài))。深度標(biāo)尺:能跟蹤一次 read() 從用戶態(tài)到內(nèi)核的完整路徑、能用 strace 調(diào)試。07 同步與并發(fā) ??(BSP 核心)定位:Linux 并發(fā)比裸機(jī)復(fù)雜百倍(SMP 搶占 中斷 軟中斷同時(shí)存在)。核心重點(diǎn):自旋鎖(spinlock,SMP 多核忙等,不可睡眠);互斥鎖(mutex,可睡眠);信號(hào)量(semaphore);RCU(Read-Copy-Update,Linux 獨(dú)門,讀無(wú)鎖);原子操作(atomic_t);percpu 變量(每核一份,免鎖);關(guān)搶占/關(guān)中斷(preempt_disable/local_irq_save);內(nèi)存屏障(smp_mb/wmb/rmb,對(duì)接 [[06b-內(nèi)存架構(gòu)深挖 PMA-ePMP-Cache-CMO-MMU-RVWMO]] 的 RVWMO)。對(duì)照錨點(diǎn):FreeRTOS 臨界區(qū)/信號(hào)量/互斥(你的主場(chǎng))。深度標(biāo)尺:能選對(duì)同步原語(yǔ)(自旋 vs 睡眠)、能讀懂 RCU 用法、能定位死鎖/競(jìng)態(tài)。08 時(shí)間與定時(shí)器定位:定時(shí)器從裸機(jī)一個(gè) mtimecmp跳到hrtimer clocksource tick nohz多層。核心重點(diǎn):clocksource(時(shí)鐘源抽象);clock_event(時(shí)鐘事件);tick(周期中斷,調(diào)度心跳);hrtimer(高精度定時(shí)器,紅黑樹(shù));NOHZ(tickless,省電);延時(shí)(mdelay/udelay 忙等 vs msleep 睡眠);jiffies vs ktime。對(duì)照錨點(diǎn):FreeRTOS tick(你深到 port 層配 mtimecmp)、[[05-中斷系統(tǒng) PLIC-CLINT-AIA]] 的 CLINT mtime。深度標(biāo)尺:能寫(xiě) hrtimer 驅(qū)動(dòng)、能配 NOHZ、能解釋 FreeRTOS tick 和 Linux tick 的差異。L3 驅(qū)動(dòng)核心 — BSP 主場(chǎng)(你的轉(zhuǎn)型目標(biāo))09 內(nèi)核模塊與 kbuild ??(BSP 核心)定位:你寫(xiě)驅(qū)動(dòng)的入口,天天用。核心重點(diǎn):模塊機(jī)制(LKM,動(dòng)態(tài)加載/卸載);module_init/module_exit;kbuild(Makefile/Kconfig/Kbuild);模塊符號(hào)導(dǎo)出(EXPORT_SYMBOL);模塊參數(shù);模塊依賴;insmod/rmmod/modprobe;模塊 vs 內(nèi)建;簽名與安全加載。對(duì)照錨點(diǎn):你懂靜態(tài)鏈接([[09-工具鏈深挖 relaxation-ELF]]),模塊是運(yùn)行時(shí)鏈接。深度標(biāo)尺:能寫(xiě)完整模塊 Makefile、能調(diào)模塊加載失敗、能用模塊參數(shù)配置驅(qū)動(dòng)。10 設(shè)備模型 ??(BSP 核心)定位:Linux 驅(qū)動(dòng)框架的地基,不理解設(shè)備模型就讀不懂任何框架。核心重點(diǎn):kobject/kset(對(duì)象層級(jí));bus/driver/device三角關(guān)系;sysfs(設(shè)備樹(shù)在用戶態(tài)的投影);udev/mdev(用戶態(tài)設(shè)備節(jié)點(diǎn)管理);設(shè)備引用計(jì)數(shù)(kref);熱插拔(uevent)。對(duì)照錨點(diǎn):MCU 沒(méi)這層(直接 struct),這是 Linux 的OO 框架。深度標(biāo)尺:能讀懂 sysfs 結(jié)構(gòu)、能解釋 driver probe 怎么被觸發(fā)、能調(diào)設(shè)備綁定問(wèn)題。11 驅(qū)動(dòng)框架 ???(BSP 主場(chǎng)核心)定位:你寫(xiě)驅(qū)動(dòng)的主戰(zhàn)場(chǎng),platform/char/misc 三大框架 設(shè)備樹(shù)。核心重點(diǎn):platform 驅(qū)動(dòng)(嵌入式無(wú)總線設(shè)備主力,probe/remove);字符設(shè)備(cdev/file_operations,open/read/write/ioctl);misc 驅(qū)動(dòng)(簡(jiǎn)化字符設(shè)備);設(shè)備樹(shù)(DTS,硬件描述,取代板級(jí)代碼);file_operations 全表(open/release/read/write/ioctl/mmap/poll);并發(fā)與錯(cuò)誤處理在驅(qū)動(dòng)里怎么寫(xiě)。對(duì)照錨點(diǎn):你寫(xiě)過(guò)的裸機(jī) UART/SPI/I2C 驅(qū)動(dòng)(直接寄存器)→ Linux 版要包框架。深度標(biāo)尺:能從零寫(xiě)一個(gè) platform 字符設(shè)備驅(qū)動(dòng) 設(shè)備樹(shù)節(jié)點(diǎn)、能用 poll 實(shí)現(xiàn)非阻塞、能調(diào) probe 失敗。12 VFS 與文件系統(tǒng)定位:一切皆文件的實(shí)現(xiàn)層,所有設(shè)備節(jié)點(diǎn)最終落 VFS。核心重點(diǎn):VFS 四對(duì)象(superblock/inode/dentry/file);file_operations(和字符設(shè)備共用);掛載(mount);procfs/sysfs/debugfs(內(nèi)核信息出口);ext4 概念(不深挖,知道布局);頁(yè)緩存(對(duì)接 04)。對(duì)照錨點(diǎn):MCU 無(wú)文件系統(tǒng)(你用 struct 直接訪問(wèn)),Linux 一切經(jīng) VFS。深度標(biāo)尺:能讀懂 open()→VFS→驅(qū)動(dòng) read 的完整路徑、能用 debugfs 導(dǎo)出調(diào)試信息。L4 深入 — 選學(xué),觸達(dá)式13 塊 IO 層定位:存儲(chǔ)驅(qū)動(dòng)(EMMC/NVMe/SATA)的地基,做存儲(chǔ)驅(qū)動(dòng)必學(xué)。核心重點(diǎn):bio(塊 IO 請(qǐng)求);request_queue;IO 調(diào)度器(mq-deadline/bfq/kyber);blk-mq(多隊(duì)列,現(xiàn)代);page cache 交互(對(duì)接 04)。對(duì)照錨點(diǎn):你 UART DMA linklist(類似批量傳輸)。深度標(biāo)尺:能讀懂塊設(shè)備驅(qū)動(dòng)框架、能解釋 IO 調(diào)度器對(duì)延遲的影響。14 網(wǎng)絡(luò)協(xié)議棧定位:網(wǎng)絡(luò)驅(qū)動(dòng)/socket 的地基,Linux 的強(qiáng)項(xiàng)。核心重點(diǎn):sk_buff(網(wǎng)絡(luò)包核心結(jié)構(gòu));網(wǎng)絡(luò)層(socket/sock);netfilter(iptables 鉤子);網(wǎng)卡驅(qū)動(dòng)框架(net_device/napi);協(xié)議棧分層(L2→L4)。對(duì)照錨點(diǎn):MCU lwIP(你可能用過(guò))。深度標(biāo)尺:能讀懂網(wǎng)卡驅(qū)動(dòng) napi 輪詢、能用 netfilter 做包過(guò)濾。15 電源管理 ?定位:嵌入式/移動(dòng)設(shè)備必學(xué),你的 AEGIX 功能安全芯片也要低功耗。核心重點(diǎn):suspend/hibernate(系統(tǒng)級(jí)睡眠);Runtime PM(設(shè)備級(jí),空閑即睡);cpufreq(動(dòng)態(tài)頻率);cpuidle(空閑狀態(tài));PM QoS(延遲要求);wakeup source(喚醒源);驅(qū)動(dòng) PM 回調(diào)(suspend/resume)。對(duì)照錨點(diǎn):FreeRTOS tickless idle、RISC-V WFI。深度標(biāo)尺:能給驅(qū)動(dòng)加 Runtime PM、能調(diào) suspend 死機(jī)、能配 cpufreq 調(diào)頻。16 調(diào)試與性能 ?定位:你 gdb stat_snap 的延伸,Linux 有更強(qiáng)工具鏈。核心重點(diǎn):printk(分級(jí)日志);ftrace(函數(shù)追蹤,神器);perf(性能剖析,對(duì)接你 stat_snap);kprobe/kretprobe(動(dòng)態(tài)探針);eBPF(現(xiàn)代可編程追蹤);/proc/meminfo|cpuinfo;crash dump(死機(jī)分析,對(duì)接你的死機(jī)五步法);lockdep(鎖依賴檢測(cè))。對(duì)照錨點(diǎn):[[10-調(diào)試與性能計(jì)數(shù)器]](你 stat_snap)、[[ARM vs RISC-V ?;厮菁夹g(shù)]]。深度標(biāo)尺:能用 ftrace 定位函數(shù)調(diào)用鏈、能用 perf 找熱點(diǎn)、能用 eBPF 做自定義追蹤。四、優(yōu)先級(jí)速查級(jí)別模塊觸發(fā)時(shí)機(jī)??? 立即03 進(jìn)程調(diào)度 / 04 內(nèi)存內(nèi)核中心數(shù)據(jù)結(jié)構(gòu),先建??? BSP 主場(chǎng)11 驅(qū)動(dòng)框架你轉(zhuǎn)型目標(biāo)的核心?? 立即01 哲學(xué) / 02 啟動(dòng) / 05 中斷 / 07 同步 / 09 模塊 / 10 設(shè)備模型地基驅(qū)動(dòng)框架? 延后06 syscall / 08 時(shí)間 / 12 VFS / 15 電源 / 16 調(diào)試觸達(dá)式填選學(xué)13 塊IO / 14 網(wǎng)絡(luò)做對(duì)應(yīng)驅(qū)動(dòng)時(shí)五、學(xué)習(xí)方法:對(duì)照法(治無(wú)從下手)5.1 Linux vs FreeRTOS 對(duì)照概念FreeRTOSLinux差異本質(zhì)任務(wù)單位TCBtask_structLinux 大得多(含 mm/fs/files)調(diào)度優(yōu)先級(jí)搶占CFS/EEVDF 公平Linux 不靠?jī)?yōu)先級(jí)靠虛擬時(shí)間棧每任務(wù)獨(dú)立棧,你定大小內(nèi)核棧 8/16KB 固定 用戶棧Linux 內(nèi)核棧小,不能深遞歸中斷 ISRFromISR API頂半部 下半部Linux 推遲到可睡眠上下文信號(hào)量二值/計(jì)數(shù)semaphore(可睡眠)同名但 Linux 能睡互斥Mutex(優(yōu)先級(jí)繼承)mutex(可睡,有 debug)都有優(yōu)先級(jí)繼承臨界區(qū)關(guān)中斷自旋鎖/關(guān)搶占Linux 多核要自旋堆heap_4 等幾種buddyslabkmallocLinux 分層分配tickmtimecmp 配hrtimerticknohzLinux 高精度省電5.2 Linux vs RISC-V bare-metal 對(duì)照(剛學(xué)完)概念RISC-V bare-metalLinux差異本質(zhì)特權(quán)M/S/U 你在 M內(nèi)核在 S,用戶在 ULinux 用 S 態(tài),不用 Mtrap你寫(xiě) trap entry內(nèi)核 trap_init 接管Linux 框架化中斷PLIC 直接配irq_domain 框架Linux 抽象 hwirq→virqMMUsatp 你可配可不配必用,每進(jìn)程頁(yè)表Linux 依賴 MMU啟動(dòng)BootROM→BL→_startBootROM→U-Boot→start_kernel→initLinux 多了 init 進(jìn)程設(shè)備描述C 結(jié)構(gòu)體/宏設(shè)備樹(shù) DTSLinux 運(yùn)行時(shí)解析硬件雙對(duì)照是你學(xué) Linux 的加速器每讀一個(gè) Linux 概念,先在腦子里找 FreeRTOS/RISC-V 對(duì)應(yīng)物,再看 Linux 多了什么、為什么多。你的知識(shí)不是白學(xué),是 Linux 的子集——這個(gè)認(rèn)知能消除無(wú)從下手的恐慌。六、反 stall 提醒[!warning] 這專題和 [[Linux-BSP驅(qū)動(dòng)進(jìn)階22周計(jì)劃-方案B]] 不搶時(shí)間,是互補(bǔ)本專題:知識(shí)底盤,系統(tǒng)化整理 Linux 內(nèi)核模塊,讓你懂為什么。22 周計(jì)劃:項(xiàng)目驅(qū)動(dòng),在 Pi5 上寫(xiě)驅(qū)動(dòng),讓你會(huì)動(dòng)手。兩者是理論 實(shí)踐關(guān)系,不沖突。判斷標(biāo)準(zhǔn):本專題建好后,你做 22 周計(jì)劃的 lab 時(shí),有多少次回來(lái)查專題。沒(méi)查專題空談在 stall;常查專題在工作。別把本專題當(dāng)讀完才動(dòng)手的前置——邊寫(xiě)驅(qū)動(dòng)邊回查才是正道。七、分篇規(guī)劃(逐篇建,本表隨寫(xiě)隨勾)16 篇按順序?qū)?每篇統(tǒng)一結(jié)構(gòu):定位 / 重點(diǎn) / 對(duì)照錨點(diǎn) / 深度標(biāo)尺 / 嵌入式視角 callout / 對(duì)照表 / 速查表 / 相關(guān)筆記 wikilink。每篇貼合你的 BSP 轉(zhuǎn)型背景。[[01-Linux內(nèi)核心智模型與設(shè)計(jì)哲學(xué)]] —— 宏內(nèi)核/一切皆文件/機(jī)制vs策略/arch抽象/惰性分配/進(jìn)程為中心/四大認(rèn)知沖擊[[02-內(nèi)核啟動(dòng)流程]] —— BootROM→U-Boot→head.S→start_kernel→init;initcall;設(shè)備樹(shù);cmdline;多核啟動(dòng)[[03-進(jìn)程管理與調(diào)度]] —— task_struct全景/狀態(tài)/上下文切換/CFSEEVDF/調(diào)度策略/搶占/fork-exec-wait[[04-內(nèi)存管理]] —— mm_struct/VMA/Buddy/Slab/kmalloc vs vmalloc/缺頁(yè)/mmap/Page Cache/DMA/OOM[[05-中斷與下半部]] —— irq_domain/irqchip/頂半部約束/softirq-tasklet-workqueue/threaded irq/親和性[[06-系統(tǒng)調(diào)用]] —— ecall機(jī)制/syscall表/read完整路徑/pt_regs/VDSO/strace/copy_to-from_user[[07-同步與并發(fā)]] —— spinlock變種/mutex/semaphore/atomic/RCU/percpu/關(guān)搶占關(guān)中斷/內(nèi)存屏障/lockdep[[08-時(shí)間與定時(shí)器]] —— clocksource/clock_event/tick/hrtimer/timer_list/jiffies vs ktime/udelay vs msleep/NOHZ[[09-內(nèi)核模塊與 kbuild]] —— LKM/module_init-exit/Makefile/加載流程/EXPORT_SYMBOL/module_param/Kconfig[[10-設(shè)備模型]] —— kobject/kref/kset/device/device_driver/bus_type/class/sysfs/ueventudev[[11-驅(qū)動(dòng)框架 platform-char-misc-設(shè)備樹(shù)]] —— platform骨架/字符設(shè)備cdev/file_operations全表/misc/ioctl/poll/mmap/devm_/設(shè)備樹(shù)DTS[[12-VFS 與文件系統(tǒng)]] —— VFS四對(duì)象(superblock/inode/dentry/file)/掛載/路徑查找/procfs-sysfs-debugfs/ext4[[13-塊 IO 層]] —— bio/request/request_queue/IO調(diào)度器/blk-mq/塊驅(qū)動(dòng)gendisk/iostat[[14-網(wǎng)絡(luò)協(xié)議棧]] —— socket/sk_buff/net_device/NAPI/netfilter五鉤子/路由/TSO-GSO-RSS-XDP[[15-電源管理]] —— cpuidle/cpufreqgovernor/Runtime PM/suspend/wakeup source/clock-regulator framework[[16-調(diào)試與性能]] —— printk/oops五步法addr2line/ftrace/perf火焰圖/kprobe/eBPFbpftrace/lockdep/kgdb/sysrq技術(shù)之路漫漫分享是為了更好地交流。如果本文的內(nèi)容對(duì)你有啟發(fā)希望能得到你的點(diǎn)贊 和收藏 ?。如果你在調(diào)試過(guò)程中遇到了其他問(wèn)題歡迎在評(píng)論區(qū) 留言我們一起探討。也歡迎關(guān)注 我一起交流底層開(kāi)發(fā)的那些事兒。