嵌入式 Linux 系统工程 001:Linux 系统分层与资源地图
合集 · 嵌入式 Linux 系统工程:资源、开发、使用与排障摄像头程序调用库,库通过系统调用请求内核,驱动再管理硬件。
BOOKSHELF / 知识书架
摄像头程序调用库,库通过系统调用请求内核,驱动再管理硬件。
编译发生在主机,程序运行在目标板;交叉编译器的目标三元组描述目标环境。
指令集决定 CPU 能解码什么,ABI 约定参数、寄存器、数据布局和链接规则。
BusyBox 把多个 applet 编进一个可执行文件,命令是否存在、支持哪些选项都受构建配置影响。
/proc 和 /sys 主要反映内核对象,/dev 提供设备访问入口,/run 常放本次启动的运行状态。
可复现问题需要把固件、设备树、模型、配置和硬件编号关联起来。
启动链逐步建立运行条件:早期代码初始化存储和内存,Bootloader 加载内核与设备树,内核初始化驱动并挂载根文件系统,最后启动 PID 1。
U-Boot 环境变量和内核参数不是同一套命名空间。
DTS 描述硬件连接和资源,DTB 是编译结果,运行内核使用的是启动时传入并可能被修改的树。
initramfs 在内存中提供早期用户空间,可以准备设备后切换到实际根文件系统。
PID 1 负责用户空间启动和进程回收。
Buildroot 组织工具链、内核、Bootloader 和根文件系统构建。
BitBake 按 recipe 和任务图构建,layer 组织元数据,MACHINE 表示目标硬件配置,DISTRO 表达发行策略。
/sys/devices 表达设备拓扑,/sys/class 和 /sys/bus 提供不同索引。
debugfs 用于调试接口,内容可能随版本变化;tracefs 暴露追踪控制与事件。
dmesg 读取内核环形日志,容量有限且可覆盖;用户程序 stderr 不会自动成为内核日志。
load average 反映可运行任务及某些不可中断等待任务的平均数量,不是 CPU 百分比。
一条命令失败可能发生在 Shell 找命令、工具解析参数、系统调用授权或内核实现四个层次。
fork 创建子进程,exec 替换当前进程映像,wait 回收子进程状态。
同一进程的线程共享地址空间和通常的文件描述符表,但有自己的栈、调度状态和线程 ID。
nice 影响普通调度任务的相对权重,不能保证截止时间。
亲和性约束线程可运行的 CPU 集合,不是独占 CPU,也不会自动搬走中断。
线程从等待变为可运行,到真正获得 CPU 之间存在调度延迟。
子进程退出后保留供父进程读取的状态,父进程未 wait 会出现僵尸。
高 CPU 可能是有效计算、忙轮询或异常重试;低 CPU 卡顿可能等待锁、事件、I/O 或配额。
进程地址空间通过页表映射到物理页,映射可以按需建立,虚拟连续不保证物理连续。
malloc 管理用户态分配,可能从堆或匿名映射取得空间;free 将内存归还分配器,不保证立即还给内核。
RSS 统计驻留页,共享页可能同时计入多个进程;PSS 将共享页按映射者分摊,适合估算进程群的份额。
Linux 利用空闲内存缓存文件数据,可回收缓存与不可回收占用性质不同。
CMA 支持某些连续内存分配需求,reserved-memory 则描述保留区域及用途。
分配失败可以来自进程限制、cgroup 限额、地址空间、特定内存区域或连续性要求,未必触发 OOM。
文件描述符是进程表中的索引,底层打开文件描述保存偏移和状态。
访问文件需要沿路径具备目录搜索权限;文件自身可读不代表路径可达。
块层以扇区组织请求,分区在设备上定义范围;eMMC、SD 控制器内部还可能执行擦写管理和垃圾回收。
MTD 暴露原始 Flash 的擦除和写入约束,UBI 在 MTD 之上管理逻辑擦除块和坏块,UBIFS 构建文件系统。
SquashFS 常用于压缩只读根文件系统,OverlayFS 将只读 lower 与可写 upper 组合。
write 成功通常表示数据进入内核处理路径,不一定到达非易失介质。
df 统计文件系统使用,du 汇总可见路径文件,两者口径不同。
就绪通知表示当前操作有机会不阻塞,并不保证完整消息到达。
pipe 常用于有亲缘进程,FIFO 提供文件系统入口,Unix socket 适合本机双向通信。
这些 Linux 接口把事件、定时器和信号接入 fd 事件循环。
platform 设备常用于不能自行枚举的 SoC 外设。
ko 在内核执行,firmware blob 是设备可能加载的数据或代码,两者不能互换。
硬中断处理必须快速并遵守上下文限制,线程化中断和 workqueue 可把部分工作移到可调度上下文。
pinctrl 决定引脚复用和电气配置,GPIO 描述逻辑线。
外设通常需要供电、时钟和复位顺序。
CPU 虚拟地址、物理地址和 DMA 地址是不同概念。
串口 fd 的行为受 termios 控制,规范模式可能等待换行,回显和字符转换会修改字节流。
Linux I²C 适配器编号不一定与芯片手册控制器编号相同。
SPI 传输同时涉及发送和接收,设备协议定义指令、地址、dummy 和数据阶段。
GPIO line 请求建立所有权和配置,释放请求后电平保持行为取决于硬件与驱动,不能默认永久保持。
硬件 PWM 由控制器产生周期,用户态定时 sleep 翻转 GPIO 不能等价替代。
evdev 以类型、代码和值表达事件,SYN_REPORT 划分一组更新。
SocketCAN 将 CAN 控制器接入网络栈,应用使用 CAN socket。
Host 管理总线,Gadget 把板子呈现为 USB 设备,双角色控制器还涉及角色切换。
PCIe 链路建立、配置空间可读、资源分配、驱动绑定、DMA 成功是逐层推进的。
典型流式采集经历能力查询、格式协商、申请缓冲、入队、启动、出队和再入队。
Media Controller 用 entity、pad 和 link 表达媒体管线;subdev 描述 sensor、接收器等子设备。
ALSA PCM 把采样流组织为环形缓冲和 period,frame 包含同一采样时刻的各通道数据。
DRM/KMS 用 connector、encoder、CRTC 和 plane 表达显示资源。
厂商 SDK 常把采集、处理、编码和推理封装为模块及通道。
网卡逻辑状态 UP 与物理 carrier 是不同条件。
发送 IP 数据先按路由决定出口及下一跳,再解析相邻链路层地址。
DHCP 提供地址及租约配置,DNS 负责名字解析,NTP 等协议校准时钟,三者独立。
TCP 提供有序字节流,应用仍需消息边界和超时协议;UDP 保留数据报边界但不保证送达。
ss 展示 socket 状态,抓包观察特定位置的网络数据,两者回答不同问题。
吞吐与单包延迟不是同一目标,批处理可能提高前者却增加后者。
无线连接包括设备总线、固件、射频关联、认证和 IP 配置多个层次。
编译器目标、头文件、链接库和运行时必须一致。
Shell 执行失败可能来自权限、挂载 noexec、架构、解释器、动态库或脚本 shebang。
守护程序应有清晰的前台运行模式、退出状态和停止协议,交由 init 管理。
Linux 将部分特权拆为 capabilities,但文件权限、namespace 和 LSM 仍共同影响访问。
strace 观察系统调用及信号,可回答程序卡在哪个内核接口、收到什么错误。
调试符号把地址映射到函数和源行,优化可能内联函数或移除变量。
core 保存进程异常时的部分状态,是否生成受资源限制、core_pattern、权限和服务策略影响。
ASan 检测多类越界和释放后使用,UBSan 检测部分未定义行为。
perf 可读取性能事件并采样调用栈,但事件支持取决于 PMU、内核和权限。
静态 tracepoint 记录内核定义的事件,函数追踪观察调用行为。
eBPF 可在受控内核挂点运行经验证的程序,采集事件并通过 map 等传递结果。
Oops 报告内核异常,后续行为取决于上下文和策略;panic 则进入不可继续正常运行的处理路径。
hung task 常报告长时间不可中断等待;soft lockup 和 hard lockup 监测不同层次的 CPU 进展。
lockdep 检查锁依赖及上下文规则,KASAN 等工具辅助检测内核内存错误。
CLOCK_REALTIME 表示墙上时间,可能被校准;CLOCK_MONOTONIC 适合测量同系统的持续时间。
系统休眠面向整机,runtime PM 管理运行期间的单设备空闲。
硬件 watchdog 监测喂狗行为,不直接理解业务健康。
namespace 隔离可见视图,cgroup 管资源,容器共享宿主内核。
案例输入是构造日志,包含控制台已启动、根设备等待和 init 执行失败三类事件。
无图沿供电、控制、出流、接收、ISP、缓冲和应用逐层检查。
先把预处理、排队、设备执行、后处理和输出拆开,再核对模型、频率和输入形状。
视频流的用户体验由采集到呈现的年龄决定,网络吞吐足够也可能积压旧帧。
长期异常需要观察资源斜率和业务周期,而不是只看崩溃瞬间。
沿启动阶段定位无串口、DDR 初始化失败与内核挂起。
区分管理路径、帧传输和网络协议,解释有链路但不能通信。
分清接口家族、协议层和物理层,避免把 MIPI 当作一种线缆。
区分像素时序、传输方式和面板初始化,定位黑屏与花屏。
认识串并转换、反向控制和链路诊断,避免按连接器判断互通。
按当前项目记录签名升级从项目公钥与私钥配对、镜像导入、OTA 打包,到离线校验、设备刷写及重启确认的完整使用流程。
将双轴步进驱动接入 Func 管理线程和 Qt 产测工具,完整解释校准状态、TCP 与 IPC、手动续期、断线停止、参数事务和打包验收。
理解云台坐标、行程和 ioctl ABI,实现运动中替换目标,利用命令序列保护避免旧流程覆盖新动作,并逐步分析归零回中。
从 BA4K 的五线四相电机、ULN2803 和八拍相序开始,完成设备树适配、双轴高精度定时、内核模块构建及小步验证。
以 BA4K 板上的 CT1820B 为例,完整记录硬件确认、w1 驱动分层、内核与设备树配置、按需测温、交叉编译、板端验证、应用集成和故障排查。