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/bin

touch

文件不存在:

创建空文件

文件存在:

不清空内容
更新时间戳

cp

cp = copy
-r = recursive
cp -r project backup

mv

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.txt

23. 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 -h

du

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 用户空间运行模型。