**1. 干什么** 外部命令不直接手写陷入指令,而是统一经过 C 库(Linux glibc/musl/bionic、Windows msvcrt/ucrt、macOS libSystem)。C 库承担可移植、易用封装与标准接口三层作用。 **2. 谁在调** * 用户态主体:所有外部命令进程。 * C 库封装层:glibc 等库把系统调用号、陷入指令、错误处理统一封装为命名函数。 * 内核态主体:不变,仍由系统调用服务例程执行。 **3. 做什么业务** 可移植性:系统调用号随 CPU 架构与操作系统变化,C 库把差异藏在函数名后,同一 C 程序重新编译即可适配。易用性:C 库提供带缓冲的`fopen`/`fread`/`printf`,管理缓冲区并把错误码翻译为可读字符串。标准接口层:所有外部命令经过同一层,使库函数劫持与集中监控成为可能。 **4. 组件清单** * 系统调用号适配层 * 缓冲 I/O 与错误翻译 * 动态链接器与符号解析 * `LD_PRELOAD`预加载机制 **5. 最小可运行** ``` # 查看外部命令动态链接依