标准 C 库 IO 函数标准 C 库 IO 和 Linux 系统 IO 的关系虚拟地址空间1. 概念本质虚拟地址空间是程序员想象出来的概念实际并不存在物理实体作⽤解决程序加载到内存时的空间分配问题如4G内存⽆法同时加载1G2G2G程序的情况解释编程模型中的关键概念如栈、堆等数据结构的内存分布⽣命周期程序执⾏时由系统创建对应进程和虚拟地址空间程序结束后虚拟地址空间即消失⼤⼩决定因素32位系统2322^{32}232字节 4GB64位系统通常为2482^{48}248字节⾮2642^{64}2642. 用户区详解地址范围0-3GB32位系统可操作性普通⽤户可直接读写核⼼区域受保护区域0-4KB存放NULL指针等特殊值text段存储⼆进制机器指令程序代码data段已初始化的全局变量bss段未初始化的全局变量包括显式赋0的情况int a0;堆空间通过new/malloc分配从低地址向⾼地址增⻓空间通常较⼤栈空间存储局部变量等从⾼地址向低地址增⻓空间通常较⼩共享库动态链接库的加载区域命令⾏参数main函数的argc,argv参数存储区环境变量通过env命令查看的系统环境变量存储区3. 内核区详解地址范围3-4GB32位系统访问限制普通⽤户⽆读写权限⾮法访问会导致段错误访问⽅式必须通过系统调⽤Linux API核⼼功能内存管理包括虚拟内存映射进程管理进程调度与控制设备驱动⽹卡/显卡等硬件驱动VFS虚拟⽂件系统管理映射机制通过 CPU 的 MMU内存管理单元实现虚拟地址到物理地址的转换实际物理内存占⽤远⼩于 4GB 虚拟空间文件描述符1. 程序与进程的区别程序特性源代码和可执⾏⽂件都是程序只占⽤磁盘空间不占⽤内存空间进程特性程序运⾏时的实例操作系统为进程分配资源CPU、内存等占⽤内存空间具有虚拟地址空间映射关系通过 CPU 的 MMU 单元将虚拟地址映射到物理内存2. 可执⾏⽂件的操作⽂件操作流程使⽤fopen打开⽂件使⽤fread/fwrite进⾏读写操作定位机制⽂件指针包含⽂件描述符描述符⽤于定位磁盘上的具体⽂件3. 文件描述符的位置(1文件描述符在内核区内存布局 (32 位的系统举例)0-3G 为⽤户空间3G-4G 为内核区存储位置⽂件描述符保存在进程内核区(2⽂件描述符由内核管理管理机制通过 PCB进程控制块管理PCB 是内核中复杂的结构体包含内存管理、⽂件描述符等模块4. 文件描述符表(1文件描述符表的作⽤数据结构PCB 中的数组结构功能存储多个⽂件描述符⽀持进程同时操作多个⽂件必要性⼀个进程可能同时打开多个⽂件(2文件描述符表的大小默认容量1024 个描述符实际限制决定进程能同时打开的最⼤⽂件数(3⽂件描述符表的前三个默认被占⽤情况标准描述符0STDIN_FILENO标准输⼊1STDOUT_FILENO标准输出2STDERR_FILENO标准错误绑定对象都指向当前终端设备/dev/tty状态默认保持打开状态(4Linux 系统⼀切皆文件Linux特性硬件设备虚拟为⽂件如显示器、⽹卡通过设备⽂件管理硬件终端文件标准 I/O 对应的终端设备⽂件Linux 系统文件的底层存储架构在 Linux 文件系统中一个文件并不是作为一个整体连续存放在磁盘上的而是被拆分为以下三个核心部分Inode索引节点Index Node本质文件的元数据面板。包含内容文件大小、访问权限rwx、所有者UID、所属组GID、时间戳以及指向实际数据块的指针。唯一标识每个 Inode 在所属的文件系统内都有一个唯一的、非负整数编号称为Inode ID。内核访问文件时实际上是通过 Inode 号来识别的而非文件名。Data Block数据块本质磁盘上实际存放文件内容的物理区域如代码、文本、图片等。Directory Entry目录项简称 dentries本质Linux 中“一切皆文件”目录也是一个文件。目录的数据块中存放的是一张映射表记录了该目录下的| 文件名 | Inode 编号 |的对应关系。结论文件名并不存储在文件本身的元数据中而是存储在其父目录的映射表里。