banner
按时间整理的学习笔记。

文章归档

Scroll down
IT

一、RootFS 是什么

RootFS 是根文件系统,是 Linux 用户态运行的基础。内核启动后,必须挂载 RootFS,然后启动第一个用户态进程。

RootFS 里通常包含:

  • Shell。
  • 基础命令。
  • 动态库。
  • 配置文件。
  • 设备节点。
  • 启动脚本。
  • 应用程序。

一、为什么要理解启动流程

嵌入式 Linux 出问题时,经常不是应用代码的问题,而是系统还没正常启动。比如串口没有输出、内核卡住、根文件系统挂载失败、应用没有自启动。

理解启动流程可以帮助你定位问题发生在哪一层:

1
BootROM -> SPL -> U-Boot -> Kernel -> RootFS -> Init -> App

一、为什么要服务化

一个程序能在终端运行,不代表适合部署。真正部署到 Linux 设备或服务器时,需要解决:

  • 开机自动启动。
  • 异常退出自动重启。
  • 统一查看日志。
  • 使用非 root 用户运行。
  • 控制启动顺序。
  • 优雅停止。

Linux 现代发行版通常使用 systemd 管理服务。

一、为什么需要 epoll

阻塞 socket 服务端一次只能等待一个连接或一个读写事件。客户端数量少时问题不大,但连接数变多后,多进程和多线程模型会带来上下文切换、内存占用和调度开销。

Linux 下高并发网络服务常用 epoll

epoll 适合:

  • 大量连接。
  • 多数连接空闲。
  • 事件驱动服务端。
  • 长连接服务。

一、什么是 IPC

IPC 是 Inter-Process Communication,也就是进程间通信。Linux 中每个进程默认有独立地址空间,一个进程不能直接访问另一个进程的内存。如果多个进程需要协作,就需要 IPC。

常见 IPC 方式:

  • 管道 pipe。
  • 命名管道 FIFO。
  • 信号 signal。
  • 共享内存 shared memory。
  • 消息队列 message queue。
  • Unix Domain Socket。
  • TCP/UDP socket。

一、为什么需要设备树

在嵌入式 Linux 中,内核需要知道硬件板子上有什么设备、这些设备接在哪些总线上、使用哪些 GPIO、中断、时钟和寄存器地址。

这些硬件描述不适合全部写死在驱动代码里,所以 Linux 使用设备树描述硬件。

设备树的作用:

  • 描述硬件资源。
  • 把板级差异从驱动中分离出来。
  • 让同一个驱动适配不同板子。
  • 让内核启动时创建设备。

一、为什么外设总线重要

嵌入式开发经常要和硬件打交道。传感器、屏幕、Flash、按键、LED、通信模块都需要通过某种接口和主控芯片连接。

最常见的外设接口:

  • GPIO。
  • UART。
  • I2C。
  • SPI。
  • PWM。
  • ADC。

理解这些接口,是从应用开发走向板级开发和驱动开发的基础。

一、什么是交叉编译

交叉编译是指在一种平台上编译另一种平台运行的程序。比如在 x86_64 Ubuntu 电脑上编译 ARM 开发板运行的程序。

常见组合:

1
2
开发机:x86_64 Linux
目标板:ARM Linux

为什么需要交叉编译:

  • 开发板性能弱,编译慢。
  • 开发板存储小,不适合安装完整工具链。
  • CI/CD 通常运行在服务器上。
  • 需要统一构建环境。

一、什么是嵌入式开发

嵌入式开发是围绕特定硬件设备进行的软件开发。和普通 PC 或服务器开发相比,嵌入式更关注硬件资源、实时性、功耗、启动速度、稳定性和长期运行。

常见设备:

  • 路由器。
  • 工业控制器。
  • 智能家居设备。
  • 车载设备。
  • 摄像头。
  • 网关。
  • 可穿戴设备。

一、为什么调试能力很重要

Linux 应用开发真正的难点不只是写代码,而是程序出问题时能不能定位。程序可能在你的机器上正常,在服务器上崩溃;可能测试环境正常,生产环境慢;也可能偶发死锁、内存泄漏、文件句柄耗尽。

调试和排错要形成固定流程:

1
确认现象 -> 收集信息 -> 缩小范围 -> 验证假设 -> 修复 -> 回归
15678916
请输入关键词进行搜索