Linux 学习记录:Process 之前总结回顾
学习目标:Ubuntu 22.04 主开发环境 + 嵌入式 Linux(Zynq / PolarFire SoC)
本文覆盖范围:从 Linux 文件/权限基础,到目录结构、设备模型、启动流程、rootfs、软件部署、动态库、挂载与文件系统;不包含 Process(进程)章节之后的内容。
0. 总体知识地图
到目前为止,可以把已学内容组织成下面几条主线:
Linux 基础
├── 文件类型与权限
├── 用户 / 组 / UID / GID
├── Shell 数据流与重定向
├── 常用文件与文本命令
├── Linux 目录结构
├── /dev / /proc / /sys
├── Boot / U-Boot / Device Tree / rootfs
├── 软件部署目录规范
├── 静态库 / 动态库 / sysroot
└── block device / partition / filesystem / mount
后续会在此基础上进入:
Process
→ File Descriptor
→ System Call
→ IPC
→ systemd
→ GCC / Make / CMake
→ Cross Compilation
→ Kernel / Driver
1. Linux 文件类型
ls -l 最前面的 10 个字符:
-rwxr-xr-x
│└──────── 9 位权限
└───────── 文件类型
【必记】文件类型字符
| 字符 | 英文 | 含义 |
|---|---|---|
- |
regular file | 普通文件 |
d |
directory | 目录 |
l |
symbolic link | 符号链接 |
c |
character device | 字符设备 |
b |
block device | 块设备 |
p |
pipe / named pipe | 管道 / 命名管道 |
s |
socket | 套接字 |
【记忆方法】
d → directory
l → link
c → character
b → block
p → pipe
s → socket
除了 -,基本都来自英文关键词首字母。
2. Character Device 与 Block Device
Character Device
c = character device = 字符设备
典型例子:
/dev/ttyUSB0
/dev/ttyS0
/dev/ttyPS0
常见于 UART / 串口等流式设备。
Block Device
b = block device = 块设备
典型:
HDD
SSD
SD Card
eMMC
NVMe
设备节点示例:
/dev/sda
/dev/mmcblk0
/dev/mmcblk0p1
【记忆方法】
character → 连续字符 / 字节流
block → 数据按块组织
3. Symbolic Link
l = symbolic link = 符号链接
简称:
symlink
例如:
python -> python3
可暂时类比 Windows 快捷方式,但 Linux symbolic link 有自身语义。
4. Pipe
p = pipe
FIFO = First In, First Out
Pipe 是 IPC(Inter-Process Communication,进程间通信)的一种方式。
Shell 中:
command1 | command2数据流:
command1 stdout
↓
pipe
↓
command2 stdin
例如:
dmesg | grep uart表示:
dmesg stdout → grep stdin
5. Socket
s = socket = 套接字
可以理解为:
程序通信的端点。
主要有:
Network Socket
Unix Domain Socket
网络通信:
Application
↓
socket
↓
TCP / UDP
↓
IP
↓
Ethernet
Unix Domain Socket 常用于同一台 Linux 主机上的进程通信,例如:
/run/myapp/control.sock
【嵌入式关联】
Zynq / PolarFire SoC 上常见:
FPGA / PL
↓
DMA / DDR
↓
Linux application
↓
TCP / UDP socket
↓
PC
6. Linux 权限对象
u = user = owner
g = group
o = others
a = all = u + g + o
例:
drwxr-x---
│ │ │
u g o
7. r / w / x
r = read
w = write
x = execute
普通文件
r → 读文件内容
w → 修改文件内容
x → 执行文件
目录
目录的 r/w/x 含义不同:
r → 读取 / 枚举目录项
w → 修改目录项
x → search / traverse,查找 / 进入 / 穿过
【记忆方法】
目录:
r = 看
w = 改
x = 走
8. 文件权限与父目录权限
这是非常重要的一组区别。
【必记】
修改文件内容 → 看文件本身的 w
删除文件 → 看父目录的 w + x
例如:
dr-x------ project/
-rwxrwxrwx project/app
可以修改 app 内容,但不能删除它,因为父目录没有 w。
【记忆方法】
文件决定“能不能改里面的东西”
目录决定“能不能增删里面的名字”
9. 数字权限
r = 4 = 100
w = 2 = 010
x = 1 = 001
【必记】
r w x
4 2 1
| 数字 | 权限 |
|---|---|
| 0 | --- |
| 1 | --x |
| 2 | -w- |
| 3 | -wx |
| 4 | r-- |
| 5 | r-x |
| 6 | rw- |
| 7 | rwx |
常见:
755 → rwxr-xr-x
644 → rw-r--r--
750 → rwxr-x---
10. chmod
数字模式:
chmod 755 myapp符号模式:
chmod u+x myapp
chmod g-w myapp
chmod go-rwx myapp结构:
对象 + 操作 + 权限
对象:
u / g / o / a
操作:
+ = add
- = remove
= = set
11. Owner / Group / UID / GID
例如:
-rwxr-x--- 1 alice developers ... myapp
↑ ↑
owner group
权限匹配顺序:
是 owner?
→ user 权限
否则属于 group?
→ group 权限
否则
→ others 权限
三组权限不是累加。
UID / GID
UID = User ID
GID = Group ID
Linux 内核更核心地使用数字 ID。
root → UID 0
12. chown / chgrp
chown = change owner
chgrp = change group
例如:
sudo chown alice:fpga project.bin表示:
owner = alice
group = fpga
格式:
owner:group
13. root / sudo
root = superuser
UID(root) = 0
sudo 可暂时理解为:
superuser do
即以更高权限执行命令。
注意:
root 权限高,但现代 Linux 还有 capabilities、AppArmor、SELinux、namespace 等更细粒度机制。
现阶段先记:
root = superuser
UID = 0
14. id / 用户组
例如:
uid=1000(alice)
gid=1000(alice)
groups=1000(alice),27(sudo),20(dialout)
含义:
uid → 用户
gid → primary group
groups → 所属全部组
术语:
primary group = 主组
supplementary group = 附加组
15. usermod -aG
sudo usermod -aG dialout alice拆解:
-a = append
-G = supplementary Groups
【必记】
-aG = append Groups
不要轻易遗漏 -a:
usermod -G dialout alice可能覆盖原有附加组。
修改组后通常需要注销并重新登录,再用:
id确认。
16. 串口权限实例
crw-rw---- 1 root dialout ... /dev/ttyUSB0
含义:
类型 = character device
owner = root
group = dialout
user = rw-
group = rw-
others = ---
如果普通用户属于 dialout,就使用 group 权限。
这在 Ubuntu 连接 Zynq / PolarFire SoC 串口时非常常见。
17. Linux 路径
/ = root directory
~ = 当前用户的 home directory
. = current directory
.. = parent directory
例如:
alice 的 ~ → /home/alice
root 的 ~ → /root
18. 绝对路径 / 相对路径
Absolute Path
以 / 开头
例如:
/home/bob/project/main.c
/etc/hosts
/usr/bin/gcc
Relative Path
依赖当前 working directory,例如:
project/main.c
../include
./myapp
19. pwd
pwd = print working directory
显示当前工作目录。
20. ls
ls = list
常用:
ls
ls -a
ls -l
ls -h
ls -alh选项:
-a = all
-l = long listing format
-h = human-readable
21. 常见文件操作命令
mkdir
mkdir = make directory
-p = parents
mkdir -p build/output/bintouch
文件不存在:
创建空文件
文件存在:
不清空内容
更新时间戳
cp
cp = copy
-r = recursive
cp -r project backupmv
mv = move
既可移动,也可重命名:
mv old.txt new.txt
mv main.c src/rm
rm = remove
-r = recursive
-f = force
注意:
-f ≠ 绕过 Linux 权限
rm -rf 是高风险命令。
rmdir
rmdir = remove directory
只能删除空目录。
-p = parents
22. cat
cat = concatenate
它经常用于查看文件,但本意是串接内容。
cat a.txt b.txt23. stdin / stdout / stderr
stdin = standard input
stdout = standard output
stderr = standard error
文件描述符编号:
0 = stdin
1 = stdout
2 = stderr
【记忆方法】
0 进
1 出
2 报错
24. Shell 重定向
> stdout 覆盖写入
>> stdout 追加写入
2> stderr 覆盖写入
2>> stderr 追加写入
< stdin 输入重定向
2>&1 stderr 指向 stdout 当前的位置
| 前一个 stdout → 后一个 stdin
2>&1
myapp > all.log 2>&1结果:
stdout → all.log
stderr → all.log
【必记】顺序有意义
Shell 从左到右处理重定向。
myapp 2>&1 > all.log最终:
stdout → all.log
stderr → terminal
25. grep
grep 名字来自:
g/re/p
≈ global regular expression print
基本格式:
grep PATTERN FILE默认行为:
找到匹配内容后输出包含匹配内容的整行。
常见选项:
-i = ignore case
-n = line number
-o = only matching
-v = invert match
-r = recursive
重要区别:
grep → 搜文件内容
find → 搜文件 / 目录本身
26. find
结构:
find WHERE CONDITIONS
常见:
find . -type f -name "*.c"
find . -type d -name "driver"
find . -type f -iname "*.h"条件:
-type f → regular file
-type d → directory
-name → 名称匹配,区分大小写
-iname → 名称匹配,忽略大小写
-maxdepth N → 最大深度
-mindepth N → 最小深度
深度:
. → depth 0
./file.txt → depth 1
./src/main.c → depth 2
27. head / tail / less
head → 看文件开头
tail → 看文件结尾
less → 分页浏览大文件
常用:
head -n 20 file.txt
tail -n 50 file.txt
tail -f app.log-f = follow
tail -f 对实时观察嵌入式程序日志很有用。
less 常用按键:
q quit
/text 搜索
n 下一个匹配
N 上一个匹配
28. file / which
file
file myapp用于判断文件实际类型和 CPU 架构,例如:
ELF ... x86-64
ELF ... ARM aarch64
ELF ... RISC-V
which
which gcc用于查看 shell 实际会执行哪个命令。
对多个交叉工具链共存时很重要。
29. Linux 统一目录树
Linux 不像 Windows 常见:
C:\
D:\
而是统一从:
/
开始。
典型结构:
/
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── proc
├── sys
├── tmp
├── usr
└── var
30. /home
/home/<user>
= 用户自己的工作空间
适合:
源码
Git 仓库
构建目录
SDK
个人脚本
测试文件
例如:
/home/alice/projects/
个人级现代目录
~/.local/bin
~/.local/lib
~/.config
~/.cache
~/.local/share
可简单记:
~/.local → 个人安装
~/.config → 个人配置
~/.cache → 个人缓存
31. /dev
/dev = device
里面主要是:
device nodes = 设备节点
例如:
/dev/ttyUSB0
/dev/ttyPS0
/dev/mmcblk0
/dev/null
/dev/zero
设备节点本身不是驱动。
关系:
/dev/xxx
↓
device node
↓
major / minor
↓
kernel driver
↓
hardware
32. Major / Minor Number
字符 / 块设备可能显示:
crw-rw---- 1 root dialout 188, 1 /dev/ttyUSB1
其中:
188 = major number
1 = minor number
可初步理解:
major → 设备 / 驱动大类
minor → 具体设备实例编号
以后写 Linux 驱动时会遇到:
dev_t
MAJOR()
MINOR()
33. /dev/null / /dev/zero
/dev/null
/dev/null = null device
写入:
全部丢弃
读取:
立即 EOF
可以记成“黑洞”。
myapp > /dev/null 2>&1表示丢弃 stdout 和 stderr。
/dev/zero
读取时持续产生:
0x00
不会立即 EOF。
EOF
EOF = End Of File
34. /proc
/proc = procfs
proc ≈ process
是虚拟文件系统。
很多内容由 Linux 内核运行时动态提供。
常见:
/proc/cpuinfo
/proc/meminfo
/proc/interrupts
/proc/mounts
/proc/<PID>/
【记忆方法】
/proc → process / runtime information
嵌入式调试中:
cat /proc/interrupts可用于查看某个 UART / DMA / GPIO / FPGA 外设 IRQ 是否增长。
35. /sys
/sys = sysfs
也是虚拟文件系统,更侧重:
device model
driver
bus
kernel objects
常见:
/sys/class
/sys/bus
/sys/devices
/sys/module
例如:
/sys/class/tty
/sys/class/net
/sys/class/block
/sys/bus/platform
/sys/bus/i2c
/sys/bus/spi
/sys/bus/pci
/sys/bus/usb
【必记】三分法
/dev → 用设备
/sys → 看 / 配置设备模型
/proc → 看运行状态
36. /etc
/etc
→ system configuration
常见:
/etc/passwd
/etc/group
/etc/shadow
/etc/hosts
/etc/fstab
/etc/ssh
/etc/systemd
/etc/passwd
主要记录用户基本信息:
username
UID
primary GID
home
login shell
/etc/group
主要记录:
group name
GID
supplementary members
/etc/shadow
保存密码哈希等敏感认证数据。
37. /boot
/boot
→ 启动相关文件
可能包括:
Linux Kernel Image
initramfs / initrd
Device Tree Blob
Ubuntu 常见:
/boot/vmlinuz-...
/boot/initrd.img-...
嵌入式 Linux 里常见:
Image
uImage
*.dtb
38. Device Tree
【必记】核心区别
Device Tree
→ 描述硬件是什么、在哪里、怎么连接
Driver
→ 描述怎么操作硬件
【记忆方法】
Device Tree = Hardware Description
Driver = Hardware Operation
39. DTS / DTC / DTB
DTS = Device Tree Source
DTSI = Device Tree Source Include
DTC = Device Tree Compiler
DTB = Device Tree Blob
流程:
board.dts
↓
DTC
↓
board.dtb
类似:
main.c → gcc → executable
40. Device Tree 常见属性
常见:
compatible
reg
interrupts
status
compatible
用于设备与驱动匹配:
compatible = "vendor,device";
基本链:
Device Tree compatible
↓
driver compatible table
↓
device ↔ driver match
reg
通常描述:
寄存器基地址
地址空间范围
关联:
MMIO = Memory-Mapped I/O
interrupts
描述设备使用的 IRQ / 中断资源。
status
"okay" → 启用
"disabled" → 禁用
41. Zynq / PolarFire SoC 与 Device Tree
例如 FPGA / PL 中加入自定义 AXI IP:
PL custom IP
├── MMIO address
└── interrupt
Linux 需要通过 Device Tree 描述:
compatible
reg
interrupts
status
驱动再根据 compatible 匹配。
典型排查:
DT node 存在?
status = "okay"?
compatible 正确?
driver 是否注册 compatible?
probe() 是否执行?
42. Boot ROM / Bootloader / U-Boot
Boot ROM
Boot ROM
= 芯片内部固化的早期启动代码
典型职责:
根据 boot mode 找到下一阶段程序
从 SD / eMMC / QSPI / NAND / JTAG 等加载
U-Boot
U-Boot = Universal Boot Loader
不是“专门启动 Linux”,而是通用嵌入式 Bootloader。
常见职责:
初始化部分硬件
访问存储 / 网络
加载 Kernel
加载 DTB
准备 kernel command line
启动 Kernel
43. Early Boot / FSBL
某些平台还需要:
FSBL = First Stage Boot Loader
用于非常早期的初始化,例如:
DDR
Clock
Pinmux
SoC 基础初始化
更通用的思维:
Power On
↓
Boot ROM
↓
Platform-specific Early Boot Firmware
↓
U-Boot
↓
Kernel + DTB
不同 SoC 的具体启动阶段名称可能不同。
44. 启动链
建议先形成这条主线:
Power On / Reset
↓
Boot ROM
↓
Early Boot Firmware
↓
U-Boot
↓
Kernel + DTB + 可选 initramfs
↓
Linux Kernel
↓
mount root filesystem
↓
init
↓
userspace
最简记忆:
Boot ROM
↓
Bootloader
↓
Kernel
↓
Userspace
45. Root Filesystem
rootfs = root filesystem
Linux Kernel 不是完整 Linux 系统。
Kernel 负责:
调度
内存管理
驱动
网络
文件系统
系统调用
rootfs 提供:
/bin
/etc
/lib
/usr
/var
你的程序
动态库
配置
init
【必记】
Kernel → 提供系统能力
rootfs → 提供用户空间
rootfs 最终挂载为:
/
46. Kernel initialization 与 Userspace initialization
Kernel initialization
→ CPU / MMU / memory / driver / scheduler ...
Userspace initialization
→ init / systemd / services / network / applications ...
如果出现:
No working init found
优先怀疑:
rootfs
init
动态库
路径
执行权限
而不是“Kernel 完全没运行”。
47. /lib / 动态库
/lib
/usr/lib
→ libraries
程序可能依赖:
libc.so
libm.so
libpthread.so
...
如果出现:
error while loading shared libraries
优先考虑:
目标板缺库
库版本不兼容
架构不一致
动态链接器路径问题
sysroot 不一致
48. .o / .a / .so
.o = object file
.a = archive = static library
.so = shared object = shared / dynamic library
静态链接
myapp.o + libfoo.a
↓
linker
↓
myapp
所需库代码被链接进最终程序。
运行时通常不再需要 libfoo.a。
动态链接
myapp
↓ runtime
libfoo.so
运行时仍需找到兼容的 .so。
【记忆方法】
.a → 链接时装进去
.so → 运行时找过来
49. ldd
ldd myapp用于查看动态库依赖。
可先记:
ldd ≈ list dynamic dependencies
但交叉编译场景下,不应盲目在 x86 host 上直接对 ARM / RISC-V 目标程序执行本机 ldd,后续学习 toolchain 时再深入。
50. /usr/include
/usr/include
→ C / C++ 系统头文件
主要用于编译阶段,不是运行阶段。
例如:
/usr/include/stdio.h
头文件:
告诉编译器函数 / 类型“长什么样”
库:
提供真正实现代码
如果报:
fatal error: xxx.h: No such file or directory
优先考虑:
include 路径
-I
头文件是否存在
sysroot
【记忆方法】
.h 找不到 → 编译阶段 → include
.so 找不到 → 运行阶段 → library
51. Cross Compiler 与 Sysroot
Cross Compiler
用于在 Host 上生成 Target 架构的机器码。
例如:
Host = x86_64 Ubuntu
Target = ARM64 Zynq
或:
Target = RISC-V PolarFire SoC
Sysroot
sysroot
→ 为目标系统准备的一套“伪根目录”
通常包括:
sysroot/
├── usr/include
├── usr/lib
└── lib
【必记】
cross compiler
→ 决定生成谁的机器指令
sysroot
→ 决定参考谁的头文件与库环境
不能拿 x86_64 的 .so 给 ARM64 程序链接。
52. /usr 常见目录
/usr/bin
→ 可执行程序
/usr/lib
→ library code / shared libraries
/usr/include
→ header files
/usr/share
→ architecture-independent shared data
记忆
bin → binary
lib → library
include → #include
share → 可共享的非机器码资源
53. /usr/local
/usr
→ 通常由发行版 / 包管理器管理
/usr/local
→ 本机管理员额外安装的软件
例如:
/usr/local/bin
/usr/local/lib
自己从源码安装的本机工具,通常比直接手工塞进 /usr/bin 更适合放这里。
54. /opt
/opt
→ optional / self-contained third-party software
适合相对独立的软件包:
/opt/acme/myapp/
├── bin
├── lib
├── plugins
└── resources
55. Linux 软件部署目录思路
以应用 fpga_capture 为例:
/usr/bin/fpga_capture
→ executable
/etc/fpga-capture/config.ini
→ configuration
/usr/lib/libcapture.so
→ shared library
/var/lib/fpga-capture/calibration.dat
→ persistent application state
/run/fpga-capture/control.sock
→ runtime state
【必记】
程序 ≠ 配置 ≠ 库 ≠ 持久数据 ≠ 临时运行状态
按职责分开部署。
56. /usr/lib vs /var/lib
这一组很容易混淆。
/usr/lib
→ library code
→ *.so 等程序库
/var/lib
→ persistent application state
→ 应用长期保存、运行中会变化的数据
【记忆方法】
/usr/lib → 库
/var/lib → 数据 / 状态
抓住:
var = variable = 会变化
57. /var
var = variable
主要放运行过程中会变化的数据。
常见:
/var/log → logs
/var/lib → persistent state
/var/cache → cache
/var/spool → queue / spool data
/var/lib vs /var/cache
/var/lib
→ 重要状态,删除可能丢数据
/var/cache
→ 缓存,理论上可以重新生成
58. /run
/run
→ runtime state
→ 当前这次启动期间的运行状态
适合:
PID files
Unix domain sockets
临时运行状态
例如:
/run/fpga-capture/control.sock
【记忆方法】
/var/lib → 重启后还要记住
/run → 本次开机期间
/tmp → 可丢弃临时文件
59. /tmp
/tmp
→ temporary files
用于临时文件。
不要把必须长期保存的数据放这里。
60. Block Device / Partition / Filesystem / Mount Point
这是存储模型里最关键的一组。
Physical Storage
↓
Block Device
↓
Partition
↓
Filesystem
↓
Mount
↓
Mount Point
↓
Files
例:
SD / eMMC
↓
/dev/mmcblk0
↓
/dev/mmcblk0p2
↓
ext4
↓
mount
↓
/
【必记】
disk → 整块存储设备
partition → 分区
filesystem → 文件组织格式
mount point→ Linux 目录树中的访问入口
61. mount
mount = 挂载
mount point = 挂载点
例如:
mount /dev/mmcblk0p1 /mnt/sdcard表示:
把
/dev/mmcblk0p1中的文件系统接入 Linux 目录树,并通过/mnt/sdcard访问。
挂载点不一定必须在 /mnt。
常见:
/mnt → 临时 / 手工挂载
/media → 桌面环境可移动介质
/data → 项目自定义数据分区
/boot → boot 分区
/ → root filesystem
62. Mount 遮挡原目录内容
如果:
/data/a.txt
原本存在,然后另一个 filesystem mount 到 /data:
a.txt 不会被删除
只是暂时看不见
umount 后会重新出现。
【必记】
mount
→ 改变当前目录入口看到的文件系统
不是
→ 删除原目录内容
63. umount
命令是:
umount /mnt/sdcard不是 unmount。
作用:
unmount filesystem
64. lsblk
lsblk = list block devices
用于查看:
block devices
partitions
mount points
常用:
lsblk
lsblk -f-f 用于显示 filesystem 相关信息。
65. Filesystem
常见:
ext4
FAT32 / vfat
SquashFS
UBIFS
NFS
ext4
ext4 = Fourth Extended Filesystem
Linux 上很常见。
嵌入式 SD 卡典型布局可能是:
p1 → FAT / boot
p2 → ext4 / rootfs
66. blkid
blkid用于查看 block device / filesystem 的:
UUID
LABEL
TYPE
UUID
UUID = Universally Unique Identifier
用于较稳定地标识 filesystem。
LABEL
人类可读的文件系统标签,例如:
boot
rootfs
data
67. /etc/fstab
fstab = file systems table
描述系统需要如何挂载文件系统。
概念结构:
设备 / UUID
↓
mount point
↓
filesystem type
↓
mount options
以后学习自动挂载和 rootfs 启动时会深入。
68. ro / rw
ro = read-only
rw = read-write
例如:
mount -o ro /dev/mmcblk0p1 /mnt/boot其中:
-o = options
【嵌入式关联】
产品中常见:
read-only rootfs
+
独立可写 /data 或 /var
可降低意外断电导致文件系统损坏的风险。
69. df / du
df
df ≈ disk free
查看已挂载 filesystem 的容量与使用率:
df -hdu
du = disk usage
查看目录 / 文件占用空间:
du -sh /var/log选项:
-s = summarize
-h = human-readable
【记忆方法】
df → 看“盘 / filesystem”
du → 看“目录 / 文件”
70. 嵌入式 Linux 当前整体模型
到 Process 章节之前,你应该逐渐建立下面这张图:
Power On
↓
Boot ROM
↓
Early Boot Firmware / FSBL
↓
U-Boot
↓
Kernel + DTB
↓
Linux Kernel
↓
Driver / Device Model
↓
/dev / /sys / /proc
↓
mount rootfs
↓
/etc / /usr / /var / /run
↓
Userspace Applications
存储侧:
SD / eMMC
↓
Block Device
/dev/mmcblk0
↓
Partition
/dev/mmcblk0p2
↓
Filesystem
ext4
↓
mount
↓
/
↓
rootfs
应用部署侧:
/usr/bin/myapp
/etc/myapp/config
/usr/lib/libxxx.so
/var/lib/myapp/state
/run/myapp/control.sock
71. 高频易混淆概念速查
文件 vs 目录权限
文件 w → 改文件内容
目录 w → 改目录项
/usr/lib vs /var/lib
/usr/lib → library code
/var/lib → persistent state
/dev vs /sys vs /proc
/dev → 用设备
/sys → 看设备模型
/proc → 看运行状态
Header vs Shared Library
.h 找不到 → 编译阶段
.so 找不到 → 链接 / 运行环境
Static vs Dynamic
.a → 静态库
.so → 动态库
Program Deployment
/usr/bin → 程序
/etc → 配置
/usr/lib → 库
/var/lib → 持久状态
/run → 本次运行状态
Storage
block device ≠ partition ≠ filesystem ≠ mount point
Boot
Bootloader ≠ Kernel
Kernel ≠ rootfs
Device Tree ≠ Driver
72. 必背最小集合
如果只保留最核心的条件反射,至少记住:
文件类型:
- regular
d directory
l link
c character device
b block device
p pipe
s socket
权限:
u user
g group
o others
r = 4
w = 2
x = 1
标准流:
0 stdin
1 stdout
2 stderr
重定向:
> stdout overwrite
>> stdout append
2> stderr
< stdin
| stdout → stdin
目录:
/dev device node
/proc runtime / process info
/sys device model
/etc configuration
/boot boot files
/usr installed userspace software
/var variable data
/run runtime state
/home user workspace
嵌入式启动:
Boot ROM
→ Early Boot
→ U-Boot
→ Kernel + DTB
→ rootfs
→ userspace
设备树:
DTS → DTC → DTB
compatible → 匹配 driver
reg → MMIO 地址资源
interrupts → IRQ
status → enable / disable
库:
.o object
.a static library
.so shared library
交叉编译:
cross compiler → 生成目标架构代码
sysroot → 目标架构 headers + libraries
存储:
disk
→ partition
→ filesystem
→ mount
→ mount point
73. 当前应形成的排障思维
以后遇到嵌入式 Linux 问题,不要只问“程序为什么不工作”,而要先判断层级:
板子没有启动?
→ Boot ROM / Bootloader
Kernel 没起来?
→ Kernel Image / bootargs / DTB
设备没有?
→ Device Tree / Driver / /sys / dmesg
设备节点权限不够?
→ /dev / owner / group / chmod
IRQ 没发生?
→ /proc/interrupts
程序执行不了?
→ file / architecture / permission
.h 找不到?
→ include / sysroot
.so 找不到?
→ dynamic library / rootfs
分区看不到文件?
→ block device / filesystem / mount
系统盘满?
→ df / du
这套“按层排查”的思路,比单纯背命令更重要。
74. 下一阶段:Process
下一阶段将从:
program ≠ process
PID = Process ID
ps / top
/proc/<PID>
file descriptor
开始。
随后会把目前已经学过的:
stdin / stdout / stderr
/dev
socket
pipe
open / read / write
逐渐连接成一套完整的 Linux 用户空间运行模型。