- 博客(115)
- 收藏
- 关注
原创 嵌入式环形缓冲区设计:串口、日志和流式协议的通用底座
环形缓冲区看起来只是两个索引加一个数组,真正难的是边界和并发语义。把写入者、读取者、满空判断、溢出策略和统计指标设计清楚,串口协议、日志系统和流式数据处理都会稳定很多。现场问题最怕“偶发且没有证据”,而一个设计良好的 ring buffer 恰好能把这些偶发问题变成可统计、可复现、可修复的工程问题。
2026-06-09 21:04:15
199
原创 STM32 DMA 双缓冲采样
STM32 DMA 双缓冲采样的关键不是把 DMA 打开,而是让“DMA 写入”和“CPU 处理”形成清晰边界。只要缓冲区大小、cache 一致性、ISR 责任、处理耗时和过载统计都设计到位,ADC 连续采样就能从“看起来能跑”变成“现场可诊断、可压测、可上线”。
2026-06-09 20:32:25
436
原创 FreeRTOS 任务设计与优先级反转排查
FreeRTOS 任务设计的核心不是多创建几个 task,而是把实时路径、资源边界和异常策略设计清楚。优先级反转也不是简单地把优先级调高就能解决,真正有效的办法是使用合适的同步对象、缩短临界区、限制阻塞时间,并建立能复现问题的压测场景。如果一个项目能做到任务职责清晰、周期稳定、共享资源可诊断、错误路径可降级,那么它在现场遇到偶发问题时就不会只能靠猜,而是能沿着证据一步步定位。
2026-06-09 20:04:55
460
原创 KCP 与 UDP 可靠传输
UDP = 最小开销的传输层- 只加了端口号和校验和(8 字节首部)- 不保证可靠性、顺序性、流量控制- 适合:实时应用、简单查询、广播/多播- 不适合:需要可靠传输的场景。
2026-06-01 09:32:55
222
原创 TCP/IP 协议解析
TCP/IP 协议栈的核心设计思想分层解耦:每层只关心自己的职责,通过标准接口交互端到端可靠性:网络层尽力而为,传输层(TCP)在端系统保证可靠性统计复用:IP 包独立路由,不需要预先建立端到端的物理链路鲁棒性:没有中心控制点,任意节点故障不影响全局(IP 的设计初衷)TCP 保证可靠性的核心机制序列号 + 确认应答 → 不丢失、不重复超时重传 + 快速重传 → 丢了能恢复校验和 → 数据不被篡改滑动窗口 → 流量控制,防止淹没接收方拥塞控制 → 适应网络状况,防止撑垮网络。
2026-06-01 09:10:05
505
原创 Linux 邻接(Neighbor)子系统架构与 NUD 状态机
从内核研发的视角看,一切网络协议皆为“状态机+队列”的折腾与调度。邻接子系统利用一个优雅精湛的 NUD 状态检测图,实现了网络上层发送操作解耦、底层的异步等待容错,以及海量缓存重试功能。掌握了及其迁移逻辑,以后面对玄学的“局域网丢包”和“首包高延迟”,你也能做到了然于胸。
2026-03-16 19:50:41
701
原创 Linux 文件设备类型分析
Linux 常见文件对象分为 7 种,VFS 提供统一入口。硬盘、U 盘、SSD 归类为块设备,因为它们的核心语义是块 I/O。字符设备更适合控制类和流式外设,因此在驱动开发里占比通常更高。除字符设备外,存储类走块设备,网卡类走网络子系统,这是主流三分法。
2026-03-16 16:02:17
376
原创 Linux 脏页回写与内存页交换机制
当所有回收手段都无法释放足够内存时,内核启动/* 选择 oom_score 最高的进程杀死 *//* oom_score 由 RSS、oom_score_adj 等因素计算 */# 查看进程的 OOM 得分# 调整 OOM 优先级(-1000 到 1000,-1000 表示永不被杀)echo -1000 > /proc/<pid>/oom_score_adj # 保护关键进程echo 1000 > /proc/<pid>/oom_score_adj # 优先被杀│ DDR 物理内存中的页 │。
2026-03-03 14:22:04
579
原创 Linux Cache 体系分析
进程 A:VA_A = 0x1000 ─┐├──→ 物理页 PA = 0x5000进程 B:VA_B = 0x9000 ─┘两个不同虚拟地址映射同一物理页(共享内存、mmap、fork-COW 等场景)。类型索引标签并行性别名问题使用场景VIVTVAVA最高严重已淘汰VIPTVAPA高条件性有PIPTPAPA低(串行)无L2/LLC,x86PIVTPAVA低有无实际使用│ CPU Cache 体系 ││▼ ▼ ▼。
2026-03-03 10:59:14
727
原创 Linux CFS 完全公平调度器
在 Linux 内核中,进程调度器决定了"谁能使用 CPU、用多久"。自 2.6.23 版本引入的CFS(Completely Fair Scheduler,完全公平调度器)彻底改变了 Linux 的调度策略——它不再给进程分配固定的时间片,而是通过一套优雅的虚拟时间机制,让所有进程按权重"公平"地共享 CPU。nice 权重机制:用户如何影响调度?nice 值的内核计算链:从用户空间到内核权重表的完整路径CFS 核心原理:vruntime、红黑树与抢占决策用权重替代固定时间片。
2026-03-03 10:53:18
759
原创 KASAN :Linux 内核内存错误检测利器
你在写/调试什么?│├── 内核代码 / 驱动│ ├── 内存越界/UAF → KASAN│ ├── 并发竞态 → KCSAN│ ├── 内存泄漏 → kmemleak│ └── 性能分析 → perf / ftrace│└── 用户空间程序├── 内存越界/UAF → ASan(-fsanitize=address)├── 线程竞态 → TSan(-fsanitize=thread)├── 未初始化内存 → MSan(-fsanitize=memory)
2026-03-03 10:38:43
891
原创 Netlink 套接字详解
创建 Socket绑定地址 (bind)初始化src_addr(sockaddr_nl),设置nl_pid为当前进程ID,nl_groups根据需要设置。发送消息 (sendmsg)构造dest_addr,其中nl_pid设为 0 (表示发给内核)。构造包含nlmsghdr的数据包,调用sendmsg。接收消息 (recvmsg)阻塞或非阻塞地接收内核返回的数据。Netlink 是 Linux 系统编程中不可或缺的一部分,特别是在网络管理、系统监控和驱动开发领域。其异步机制和灵活的消息格式。
2026-01-22 21:15:12
980
原创 VFS (虚拟文件系统) 核心架构
Linux VFS 的精妙之处在于它成功地将“接口”与“实现”分离。对于开发者:只需要掌握一套标准的文件 I/O API。对于内核:通过inodedentryfile四大对象构建了统一的模型。对于性能:通过dcache和极大地掩盖了底层磁盘慢速的特性。理解 VFS 不仅有助于理解 Linux 的文件系统,更是理解 Linux 核心设计思想(如面向对象风格的 C 语言编程)的绝佳案例。
2026-01-22 21:06:50
1191
原创 VFS(虚拟文件系统)与MM(内存管理)
VFS提供了文件的抽象视图(一切皆文件),它定义了数据存在哪里MM提供了物理资源的抽象视图,它定义了数据在内存中如何存放是两者妥协的产物。它既是文件内容在内存中的副本,也是内存管理子系统为了加速 IO 而维护的一块特定区域。理解了这个关系,你也就理解了为什么 Linux 的空闲内存总是看起来很少(因为都被 Page Cache 吃掉了),以及为什么sync命令如此重要。
2026-01-22 21:04:06
706
原创 Slab,不连续页,buddy分配器与内存映射
内核内存管理层次结构│ 高层接口(API) │↓│ 中间层(对象管理) ││ ││ │ Slab分配器 │ │ vmalloc管理 │ ││ │ - 对象缓存 │ │ - 虚拟区域 │ ││ │ - Per-CPU │ │ - 页表映射 │ │↓│ 底层(页框管理) ││ Buddy分配器 ││ - 伙伴系统算法 ││ - 以页为单位 ││ - 2的幂次方分配 │↓│ 物理内存(RAM) │。
2026-01-07 15:14:16
669
原创 Buddy分配器
支持内存节点和区域,称为分区的伙伴分配器(zoned buddy allocator)。为了预防内存碎片,把物理页框通过移动性分组。针对分配单页做了性能优化,为了减少处理器锁的竞争,在内存区域增加了1个每处理器页集合。
2026-01-07 15:03:10
564
原创 引导内存分配器 Buddy 分配器的关系
特性引导内存分配器 (memblock/bootmem)Buddy 分配器生命周期仅限于内核启动早期内核初始化完成后一直运行管理粒度粗粒度的物理地址范围精细的页框 (Page Frame)算法复杂度简单(线性扫描/数组管理)复杂(阶梯链表、反碎片、LRU等)主要职责1. 临时响应早期分配请求2. 协助初始化 Buddy 的元数据3. 将空闲内存移交给 Buddy系统运行时的通用物理内存管理简而言之,引导内存分配器是 Buddy 分配器的前置加载器。
2026-01-07 14:49:46
712
原创 物理内存组织架构与Buddy分配器关系分析
层级职责与Buddy的关系Node解决NUMA访问延迟包含多个Zone,间接管理多个Buddy实例。Zone解决硬件寻址限制Buddy分配器的宿主。每个Zone维护独立的Buddy系统来管理自己的空闲页。Page最小物理单位Buddy分配器的管理对象。Buddy系统负责将Page组织成2n2^n2n的链表。综上所述,物理内存组织架构提供了硬件抽象的容器(Node/Zone),而Buddy分配器则是填充在这些容器中的管理逻辑,两者结合实现了高效、有序的物理内存分配。
2026-01-07 14:45:59
1140
原创 Linux内存映射
物理地址是处理器在系统总线上看到的地址。使用RISC的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间。有些处理器架构把分配给外围设备的物理地址区域称为设备内存。处理器通过外围设备控制器的寄存器访问外围设备,寄存器分为控制寄存器,状态寄存器和数据寄存器三大类。应用程序只能通过虚拟地址访问外围寄存器,内核提供API函数来把外围寄存器的物理地址映射到虚拟地址空间。两个进程可以使用共享的文件映射实现共享内存。匿名映射通常是私有映射,共享的匿名映射只能出现在父进程和子进程之间。
2026-01-07 14:34:27
730
原创 Linux 调度类(sched_class)
Linux 内核把不同调度策略的实现抽象为若干调度类(sched_class),系统按固定顺序遍历这些类来选择下一个运行任务。
2025-12-19 14:18:25
1449
原创 进程、线程、内核线程与用户线程
应用并发(普通程序):使用 pthread(用户线程)或更高层并发框架(线程池、协程);高并发 I/O 或短时任务:用户线程 + 异步 I/O / 事件驱动 / 协程通常效率高;内核任务、驱动、需要直接访问内核资源或长期后台任务:使用内核线程。
2025-12-19 11:01:30
1021
原创 fork, vfork, clone 与写时拷贝
特性fork()vfork()clone()地址空间写时拷贝 (COW)共享(父进程阻塞)可配置(CLONE_VM)父进程状态并发执行阻塞,直到子进程 exec/exit并发执行主要用途创建新进程无 MMU 系统或极度追求性能创建线程 (pthread)底层调用do_fork(SIGCHLD)do_forkdo_fork(自定义 flags)
2025-12-18 19:58:50
877
原创 进程描述符 (task_struct) 与任务结构
想象一下,如果你是学校的教务处主任,你需要管理全校几千名学生。你不可能记住每个人的长相和名字,所以你会为每个学生建立一份档案。这份档案里记录了学号、班级、成绩、家庭住址等信息。在 Linux 内核中,进程就是“学生”,而进程描述符()就是这份“档案”。内核通过来感知进程的存在。无论进程处于什么状态(运行、睡眠、僵死),内核都是通过操作这个结构体来管理它的。它是 Linux 内核中最复杂、最重要的数据结构之一。是 Linux 内核管理进程的核心,它记录了进程的一切(状态、优先级、内存、文件等)。
2025-12-18 19:56:02
803
原创 Linux内高端内存
要理解高端内存,必须回到32 位 Linux 系统的背景下。特性32 位 (ARM32/x86)64 位 (AArch64/x86_64)内核虚拟空间只有 1GB (通常)128 TB 或更大物理内存瓶颈物理内存很容易超过 1GB物理内存远小于虚拟空间映射方式LowMem: 线性映射HighMem: 动态映射 (kmap)全部物理内存均为线性映射性能影响访问高端内存需要建立/解除页表映射,慢直接访问,快是否存在 HighMem存在不存在(所有内存都是 ZONE_NORMAL)
2025-12-10 10:21:01
788
原创 spi驱动
和spi_driver是并行的、服务于不同总线类型的驱动。它们通过设备树的父子关系和内核的分步初始化流程联系在一起。作为基础设施提供者(房东),负责准备好 SPI 总线。spi_driver作为设备使用者(租客),在总线就绪后,负责与具体的 SPI 从设备通信。
2025-12-10 10:13:56
354
原创 Linux 内核驱动加载机制
Platform 总线是一种虚拟总线,用于管理集成在 SoC 内部的设备(如 GPIO、I2C 控制器、SPI 控制器等),这些设备无法通过标准总线(如 PCI、USB)自动发现。特点不依赖物理总线设备信息通过设备树(DTS)或平台数据传递自动匹配设备和驱动// 设备树节点││ Subsystems (子系统层) ││ │ │ │ ││ │ ││ Device Driver Model (设备驱动模型) ││ │ (Platform 总线框架 - 核心基础) │ ││ │。
2025-11-12 20:24:40
1065
原创 Linux 中断处理机制详解:上下半部、内核线程与中断线程化
1. GPIO 按键、简单 UART:→ 传统中断 + Tasklet2. I2C/SPI 传感器:→ 线程化中断 (request_threaded_irq)3. 网卡、块设备:→ 传统中断 + NAPI/Softirq4. 复杂后台任务:→ 工作队列 或 内核线程5. 实时性要求高:→ 传统中断 + 高优先级内核线程中断上半部:快速、不睡眠、禁止中断中断下半部:延迟、可睡眠(work queue)、允许中断Softirq:最底层机制,网络/块设备使用Tasklet。
2025-11-12 20:06:31
1309
原创 U-Boot 启动流程与参数
ATAGS (ARM32 传统方式): 通过内存中的标签结构传递参数: 通过设备树二进制文件传递硬件信息和启动参数: 源文件,人类可读的文本格式: 二进制文件,编译后的设备树: 编译器,将 DTS 转换为 DTBOP-TEE (Open Portable Trusted Execution Environment) 是一个开源的可信执行环境,实现 ARM TrustZone 技术。命令说明设置内核命令行参数启动内核 (addr1=kernel, addr2=initrd, addr3=fdt)
2025-11-12 19:54:02
1070
原创 嵌入式开发中的 Git CI/CD
在不运行代码的情况下检测潜在问题。: 评估代码复杂度和可维护性。: 验证各个模块功能正确性。: 识别安全漏洞和危险函数。: 检测循环依赖和多余包含。: 确保代码有充分文档。
2025-11-12 19:38:49
1089
1
原创 MMU(内存管理单元)分析
MMU(Memory Management Unit,内存管理单元)是 CPU 中的硬件模块,负责将虚拟地址(Virtual Address, VA)转换为物理地址(Physical Address, PA),并提供内存保护功能。功能描述应用地址转换虚拟地址 → 物理地址所有内存访问内存保护访问权限检查(R/W/X)防止越界、权限提升TLB 加速缓存地址映射提高转换速度(99%+ 命中率)多级页表按需分配页表节省内存(稀疏地址空间)缓存控制定义缓存策略优化性能,正确处理 MMIO。
2025-10-22 14:28:03
2017
原创 Linux 线程调度策略
应用类型推荐策略优先级说明硬实时控制SCHED_FIFO80-99工业控制、电机驱动软实时音视频SCHED_RR50-79音频处理、视频编码周期实时任务确定性周期任务GUI 应用nice -5快速响应后台服务nice 0默认策略CPU 密集计算nice 5编译、科学计算后台清理SCHED_IDLE日志清理、垃圾回收。
2025-10-22 14:26:50
1021
原创 Cortex-M 调试技术详解:DWT、ETM、ITM 与断点机制
工具用途硬件支持典型场景DWT性能测量、数据监视所有 Cortex-M3/M4/M7定位瓶颈、追踪野指针ITM实时日志输出所有 Cortex-M3/M4/M7替代 UART 调试ETM指令流跟踪部分高端芯片代码覆盖率、深度分析FPB硬件断点所有 Cortex-M3/M4/M7Flash 代码调试。
2025-10-07 16:47:50
1729
原创 Cortex-M 中断挂起、丢中断与 EXC_RETURN 机制详解
挂起(Pending)优先级不足:当前正在处理更高优先级的中断全局中断被禁止:通过PRIMASKFAULTMASKBASEPRI屏蔽中断未使能:通过 NVIC 的NVIC_ICERx禁止了该中断EXC_RETURN是一个特殊的返回地址,存储在链接寄存器(LR)中,用于触发异常返回流程。关键特性当处理器进入异常(中断或其他异常)时,硬件自动将 EXC_RETURN 写入 LR。当 ISR 执行返回指令(如BX LR)时,若 LR 的值是 EXC_RETURN,处理器会触发异常返回。问题原因。
2025-10-07 16:09:35
1430
原创 向量表与重定位(Cortex‑M 系列)
向量表重定位是启动引导、运行时升级与 RAM 执行常用技术。核心要点是:确保拷贝完整、地址对齐、在安全(中断受控)环境下更新 VTOR,并考虑缓存一致性与多核场景。按上述步骤实现后,系统能够在运行时灵活切换中断向量,支持 Bootloader、温跃式升级、运行时代码替换等功能。注意:务必先拷贝并设置好 vector entries(MSP、Reset 不必修改,通常保留),再开启中断。不要盲目固定为 128 字节。参考:ARM Cortex‑M 权威指南(向量表章节)、设备参考手册(VTOR 对齐要求)。
2025-10-07 16:00:50
989
1
原创 ART 加速器、流水线与指令预测的关系详解
ART 加速器为流水线提供连续的指令流(避免停顿)分支预测器依赖快速取指(由 ART 保证)流水线效率 = f(缓存命中率, 预测准确率)
2025-10-07 15:06:08
2123
原创 多级流水线与指令预测
总体流程(高层):顺序(in-order)内核的处理:乱序(out-of-order)内核的处理:寄存器与物理资源恢复:异常与内存模型:降低误判惩罚的硬件技术:软件层面的缓解:Cortex-M 与 Cortex-A 的实际差异:实践要点(工程师提示):
2025-10-07 14:47:25
787
原创 STM32 Flash 访问加速器详解(ART Accelerator)
ART 加速器通过指令缓存、数据缓存和预取机制,将 Flash 访问性能提升至接近 0 等待状态。必须在启动代码中启用,否则无法发挥 CPU 全部性能。代码优化:保持局部性、减少跳转、内联小函数、循环展开。数据优化:常量放 Flash、对齐结构体、利用 D-Cache。编译器配置:使用-O2-O3+ LTO,生成高效的 Thumb-2 代码。
2025-10-07 14:46:30
1987
原创 个人写HTOS移植shell
完成移植后,Letter Shell 能为 HTOS 提供强大的交互入口,适合调试与演示使用。丰富命令集合与权限管理;支持文件系统的命令(upload/download);改进串口驱动,提高并发性能。最后附上最新仓库代码。
2025-10-07 14:10:47
1098
原创 Cortex‑M3 的饱和运算(有符号与无符号)
本文汇总 Cortex‑M3(ARMv7‑M / Thumb‑2)关于饱和运算的行为、指令与常用实现方式,便于在嵌入式 DSP/控制代码中正确使用。
2025-09-27 13:57:32
843
原创 Cortex-M 位段(Bit-Banding)简介、作用与 C 实现
位段(Bit-Banding)是 ARM Cortex-M(如 Cortex-M3/M4,基于 ARMv7-M)提供的一种硬件机制。它把内存或外设寄存器中每个位映射为别名区(alias region)中的一个 32 位字,从而可以用一次 32 位写操作对单个位进行原子地置位或复位。
2025-09-27 13:51:24
1269
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅