- 博客(104)
- 收藏
- 关注
原创 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
881
原创 VFS (虚拟文件系统) 核心架构
Linux VFS 的精妙之处在于它成功地将“接口”与“实现”分离。对于开发者:只需要掌握一套标准的文件 I/O API。对于内核:通过inodedentryfile四大对象构建了统一的模型。对于性能:通过dcache和极大地掩盖了底层磁盘慢速的特性。理解 VFS 不仅有助于理解 Linux 的文件系统,更是理解 Linux 核心设计思想(如面向对象风格的 C 语言编程)的绝佳案例。
2026-01-22 21:06:50
895
原创 VFS(虚拟文件系统)与MM(内存管理)
VFS提供了文件的抽象视图(一切皆文件),它定义了数据存在哪里MM提供了物理资源的抽象视图,它定义了数据在内存中如何存放是两者妥协的产物。它既是文件内容在内存中的副本,也是内存管理子系统为了加速 IO 而维护的一块特定区域。理解了这个关系,你也就理解了为什么 Linux 的空闲内存总是看起来很少(因为都被 Page Cache 吃掉了),以及为什么sync命令如此重要。
2026-01-22 21:04:06
662
原创 Slab,不连续页,buddy分配器与内存映射
内核内存管理层次结构│ 高层接口(API) │↓│ 中间层(对象管理) ││ ││ │ Slab分配器 │ │ vmalloc管理 │ ││ │ - 对象缓存 │ │ - 虚拟区域 │ ││ │ - Per-CPU │ │ - 页表映射 │ │↓│ 底层(页框管理) ││ Buddy分配器 ││ - 伙伴系统算法 ││ - 以页为单位 ││ - 2的幂次方分配 │↓│ 物理内存(RAM) │。
2026-01-07 15:14:16
615
原创 Buddy分配器
支持内存节点和区域,称为分区的伙伴分配器(zoned buddy allocator)。为了预防内存碎片,把物理页框通过移动性分组。针对分配单页做了性能优化,为了减少处理器锁的竞争,在内存区域增加了1个每处理器页集合。
2026-01-07 15:03:10
512
原创 引导内存分配器 Buddy 分配器的关系
特性引导内存分配器 (memblock/bootmem)Buddy 分配器生命周期仅限于内核启动早期内核初始化完成后一直运行管理粒度粗粒度的物理地址范围精细的页框 (Page Frame)算法复杂度简单(线性扫描/数组管理)复杂(阶梯链表、反碎片、LRU等)主要职责1. 临时响应早期分配请求2. 协助初始化 Buddy 的元数据3. 将空闲内存移交给 Buddy系统运行时的通用物理内存管理简而言之,引导内存分配器是 Buddy 分配器的前置加载器。
2026-01-07 14:49:46
673
原创 物理内存组织架构与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
1093
原创 Linux内存映射
物理地址是处理器在系统总线上看到的地址。使用RISC的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间。有些处理器架构把分配给外围设备的物理地址区域称为设备内存。处理器通过外围设备控制器的寄存器访问外围设备,寄存器分为控制寄存器,状态寄存器和数据寄存器三大类。应用程序只能通过虚拟地址访问外围寄存器,内核提供API函数来把外围寄存器的物理地址映射到虚拟地址空间。两个进程可以使用共享的文件映射实现共享内存。匿名映射通常是私有映射,共享的匿名映射只能出现在父进程和子进程之间。
2026-01-07 14:34:27
680
原创 Linux 调度类(sched_class)
Linux 内核把不同调度策略的实现抽象为若干调度类(sched_class),系统按固定顺序遍历这些类来选择下一个运行任务。
2025-12-19 14:18:25
1380
原创 进程、线程、内核线程与用户线程
应用并发(普通程序):使用 pthread(用户线程)或更高层并发框架(线程池、协程);高并发 I/O 或短时任务:用户线程 + 异步 I/O / 事件驱动 / 协程通常效率高;内核任务、驱动、需要直接访问内核资源或长期后台任务:使用内核线程。
2025-12-19 11:01:30
967
原创 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
792
原创 进程描述符 (task_struct) 与任务结构
想象一下,如果你是学校的教务处主任,你需要管理全校几千名学生。你不可能记住每个人的长相和名字,所以你会为每个学生建立一份档案。这份档案里记录了学号、班级、成绩、家庭住址等信息。在 Linux 内核中,进程就是“学生”,而进程描述符()就是这份“档案”。内核通过来感知进程的存在。无论进程处于什么状态(运行、睡眠、僵死),内核都是通过操作这个结构体来管理它的。它是 Linux 内核中最复杂、最重要的数据结构之一。是 Linux 内核管理进程的核心,它记录了进程的一切(状态、优先级、内存、文件等)。
2025-12-18 19:56:02
747
原创 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
713
原创 spi驱动
和spi_driver是并行的、服务于不同总线类型的驱动。它们通过设备树的父子关系和内核的分步初始化流程联系在一起。作为基础设施提供者(房东),负责准备好 SPI 总线。spi_driver作为设备使用者(租客),在总线就绪后,负责与具体的 SPI 从设备通信。
2025-12-10 10:13:56
323
原创 Linux 内核驱动加载机制
Platform 总线是一种虚拟总线,用于管理集成在 SoC 内部的设备(如 GPIO、I2C 控制器、SPI 控制器等),这些设备无法通过标准总线(如 PCI、USB)自动发现。特点不依赖物理总线设备信息通过设备树(DTS)或平台数据传递自动匹配设备和驱动// 设备树节点││ Subsystems (子系统层) ││ │ │ │ ││ │ ││ Device Driver Model (设备驱动模型) ││ │ (Platform 总线框架 - 核心基础) │ ││ │。
2025-11-12 20:24:40
982
原创 Linux 中断处理机制详解:上下半部、内核线程与中断线程化
1. GPIO 按键、简单 UART:→ 传统中断 + Tasklet2. I2C/SPI 传感器:→ 线程化中断 (request_threaded_irq)3. 网卡、块设备:→ 传统中断 + NAPI/Softirq4. 复杂后台任务:→ 工作队列 或 内核线程5. 实时性要求高:→ 传统中断 + 高优先级内核线程中断上半部:快速、不睡眠、禁止中断中断下半部:延迟、可睡眠(work queue)、允许中断Softirq:最底层机制,网络/块设备使用Tasklet。
2025-11-12 20:06:31
1073
原创 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
1000
原创 嵌入式开发中的 Git CI/CD
在不运行代码的情况下检测潜在问题。: 评估代码复杂度和可维护性。: 验证各个模块功能正确性。: 识别安全漏洞和危险函数。: 检测循环依赖和多余包含。: 确保代码有充分文档。
2025-11-12 19:38:49
783
原创 MMU(内存管理单元)分析
MMU(Memory Management Unit,内存管理单元)是 CPU 中的硬件模块,负责将虚拟地址(Virtual Address, VA)转换为物理地址(Physical Address, PA),并提供内存保护功能。功能描述应用地址转换虚拟地址 → 物理地址所有内存访问内存保护访问权限检查(R/W/X)防止越界、权限提升TLB 加速缓存地址映射提高转换速度(99%+ 命中率)多级页表按需分配页表节省内存(稀疏地址空间)缓存控制定义缓存策略优化性能,正确处理 MMIO。
2025-10-22 14:28:03
1539
原创 Linux 线程调度策略
应用类型推荐策略优先级说明硬实时控制SCHED_FIFO80-99工业控制、电机驱动软实时音视频SCHED_RR50-79音频处理、视频编码周期实时任务确定性周期任务GUI 应用nice -5快速响应后台服务nice 0默认策略CPU 密集计算nice 5编译、科学计算后台清理SCHED_IDLE日志清理、垃圾回收。
2025-10-22 14:26:50
906
原创 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
1241
原创 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
1282
原创 向量表与重定位(Cortex‑M 系列)
向量表重定位是启动引导、运行时升级与 RAM 执行常用技术。核心要点是:确保拷贝完整、地址对齐、在安全(中断受控)环境下更新 VTOR,并考虑缓存一致性与多核场景。按上述步骤实现后,系统能够在运行时灵活切换中断向量,支持 Bootloader、温跃式升级、运行时代码替换等功能。注意:务必先拷贝并设置好 vector entries(MSP、Reset 不必修改,通常保留),再开启中断。不要盲目固定为 128 字节。参考:ARM Cortex‑M 权威指南(向量表章节)、设备参考手册(VTOR 对齐要求)。
2025-10-07 16:00:50
920
1
原创 ART 加速器、流水线与指令预测的关系详解
ART 加速器为流水线提供连续的指令流(避免停顿)分支预测器依赖快速取指(由 ART 保证)流水线效率 = f(缓存命中率, 预测准确率)
2025-10-07 15:06:08
2049
原创 多级流水线与指令预测
总体流程(高层):顺序(in-order)内核的处理:乱序(out-of-order)内核的处理:寄存器与物理资源恢复:异常与内存模型:降低误判惩罚的硬件技术:软件层面的缓解:Cortex-M 与 Cortex-A 的实际差异:实践要点(工程师提示):
2025-10-07 14:47:25
728
原创 STM32 Flash 访问加速器详解(ART Accelerator)
ART 加速器通过指令缓存、数据缓存和预取机制,将 Flash 访问性能提升至接近 0 等待状态。必须在启动代码中启用,否则无法发挥 CPU 全部性能。代码优化:保持局部性、减少跳转、内联小函数、循环展开。数据优化:常量放 Flash、对齐结构体、利用 D-Cache。编译器配置:使用-O2-O3+ LTO,生成高效的 Thumb-2 代码。
2025-10-07 14:46:30
1551
原创 个人写HTOS移植shell
完成移植后,Letter Shell 能为 HTOS 提供强大的交互入口,适合调试与演示使用。丰富命令集合与权限管理;支持文件系统的命令(upload/download);改进串口驱动,提高并发性能。最后附上最新仓库代码。
2025-10-07 14:10:47
1062
原创 Cortex‑M3 的饱和运算(有符号与无符号)
本文汇总 Cortex‑M3(ARMv7‑M / Thumb‑2)关于饱和运算的行为、指令与常用实现方式,便于在嵌入式 DSP/控制代码中正确使用。
2025-09-27 13:57:32
746
原创 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
1163
原创 valgrind与coredump调试
本文对比并详述两条常用的 Native Linux 调试流程:一是用 Valgrind 帮助发现内存错误并结合 gdb 进一步定位;二是通过生成 core dump 再用 gdb 离线分析崩溃现场。注意:Valgrind 只在 Linux/WSL 等类 Unix 环境可用;Windows 上请使用 WSL/虚拟机 或等效工具。
2025-09-25 20:55:29
1006
原创 strace / ltrace / ptrace / ftrace
跟踪对象:ptrace:接口(用于实现跟踪/调试)。strace:系统调用(内核边界)。ltrace:用户态库函数调用(动态库)。ftrace:内核函数与事件(内核空间)。运行层次:ltrace/strace 在用户空间与内核交互点;ftrace 在内核空间;ptrace 为实现机制。权限:ftrace 通常需 root;strace/ltrace 可能需与目标同一用户或受 ptrace_scope 限制。可见性:strace 看不到函数内部逻辑;ltrace 看不到内核态细节。
2025-09-25 20:50:41
1063
原创 U‑Boot 结构
概述U‑Boot(Universal Bootloader)是嵌入式系统的通用引导器,负责上电后最低层硬件初始化、加载并启动操作系统。对复杂 SoC(以 Rockchip 为例),U‑Boot 通常由多个阶段组成(SPL/TPL、主 U‑Boot、可选的 TEE/ATF),并支持多种镜像格式(FIT、RK 原生、Android boot)。
2025-09-25 20:49:57
1326
原创 rk系列U-BOOT移植
本文总结 RK 系列 SoC 的典型启动流程、常见镜像格式与打包方法,结合 OK3506(RK3506,ARMv7)移植的实际经验给出要点与注意事项。
2025-09-25 20:15:55
1338
原创 FIT镜像格式详解与编译方法
images {kernel {// 二进制文件包含// 镜像类型// 目标架构// 操作系统// 压缩方式// 加载地址// 入口地址hash-1 { // 校验和signature-1 { // 数字签名fdt-1 {hash-1 {hash-1 {kernel {// 自定义加载地址// 自定义入口地址ITS文件:人类可读的源文件,定义镜像结构ITB/FIT文件:编译后的二进制镜像,U-Boot直接使用。
2025-09-12 20:22:18
1324
原创 UBOOT启动流程详解-现代FIT设备加载
设备树是描述硬件信息的数据结构,以扁平化格式存储。FDT Overlay允许在运行时动态修改设备树,无需重新编译整个设备树。模块化硬件设计可选外设支持不同硬件版本兼容动态功能启用/禁用传统方式:简单直接,适合开发调试SPL/TPL:适合存储受限和复杂初始化场景FDT启动:现代Linux系统的标准方式FIT启动:安全启动和产品化部署的首选。
2025-09-12 20:01:24
1047
原创 嵌入式 Linux 启动流程详解 (以 ARM + U-Boot 为例)
对于嵌入式开发者而言,深入理解系统的启动流程至关重要。这不仅有助于进行底层驱动开发和系统移植,还能在遇到启动失败等问题时,快速定位和解决。。过段时间仔细研究一下Uboot,看看能不能给手上这块3506移植个Uboot试试。
2025-09-03 19:33:54
1414
原创 TLSF内存算法适配HTOS
TLSF(Two-Level Segregated Fit)是一种面向实时系统的动态内存分配器设计,旨在在分配(malloc)和释放(free)操作上提供恒定时间复杂度 O(1) 的响应时间,同时保持较低的内部/外部碎片。TLSF 由 Matthew Wilson 等人提出,常用于嵌入式或实时系统中对延迟有严格要求的场景。核心思想:通过两级分离空闲列表(一级按区间级别划分,二级按子区间细分)并结合位图(bitmap)快速定位合适的空闲块,从而将查找时间限定为常数级别。这是从网上找的一个示例。
2025-09-03 19:23:24
908
原创 ELF文件格式解析
未初始化的内存(.bss)以 NOBITS 形式存在,ELF 文件中没有占用空间,但运行时会在 RAM 中分配并清零。当你在嵌入式设备上遇到崩溃、要调试现场问题或从 core 恢复现场时,ELF(尤其是带符号的 AXF)决定了 GDB 能恢复多少信息:是否有源代码行号、变量名、内存映射是否能对应到运行时地址等。的节里,该节的运行时地址是 0x08000000(典型的 MCU Flash 起始地址)。文件类型与目标、段/节的运行时含义、DWARF/符号表的重要性、如何用。中,链接器把可执行代码放在名为。
2025-09-02 20:35:13
1128
原创 CAN和CAN FD协议
CAN(Controller Area Network)是由德国Bosch公司开发的现场总线通信协议,最初用于汽车电子系统,现已广泛应用于工业自动化、医疗设备等领域。关键特性多主机架构:任意节点都可以发起通信非破坏性仲裁:基于ID优先级的总线仲裁实时性好:确定性的数据传输延迟高可靠性:多层错误检测和处理机制成本低:简单的双线差分信号仲裁机制CAN帧格式详解标准帧格式(CAN 2.0A)扩展帧格式(CAN 2.0B)CAN扩展帧格式详解(29位ID)让我详细解释CAN扩展帧格式
2025-09-02 20:16:29
1025
原创 LWIP的Socket API 与实现关系
由于本人使用的方式原因,只打算了解socket模式,其余两种方式。适合裸机的RAW模式和基础的CONNECT模式不适合面向对象的编程方式,不打算看。
2025-08-20 14:56:27
1068
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅