当前位置: 首页 > news >正文

从磁盘到内存:一次文件读取的 CPU-DMA 协作之旅

当你在 Linux 上执行cat /etc/passwd时,数据从磁盘到屏幕看似一瞬间,背后却是一场 CPU、DMA 控制器、内存控制器、Cache 控制器协同演出的精密舞蹈。本文用一个具体实例,把这个过程彻底讲清楚。


动机:为什么需要理解这个?

很多人知道"读取文件会经过 PageCache",但对DMA 是什么、CPU 如何配置它、数据如何在硬件层级流动缺乏直觉。

理解这个过程,你会:

  • 搞清楚为什么 SSD 比机械硬盘快那么多— 关键不在于顺序读写,而在于寻道时间和 IOPS,本质是 DMA 中断次数和总线等待的差异
  • 理解mmapdirect I/O的本质差异— mmap 绕过 PageCache,direct I/O 绕过 PageCache + Cache,两者各有权衡
  • 理解内核中断处理和上下文切换的开销来源— 一次磁盘读可能触发数十次中断,每次中断都是 CPU 的强制停机
  • 对性能优化有更底层的感觉— 知道为什么"预读"有效、"合并写"省力、"零拷贝"值钱

场景:一次完整的cat /etc/passwd调用链

先给出从用户敲命令到数据出现在屏幕上的完整路径,后续章节会逐段拆解。

cat/etc/passwd

cat进程执行read(fd, buf, 4096),背后触发的完整流程如下:

┌──────────────────────────────────────────────────────────────────────┐ │ 用户态(User Space) │ │ │ │ cat 进程 │ │ app 发起 read(fd, buf, 4096) ← libc 封装 │ │ ↓ │ │ int 0x80(x86 软中断) ← 触发系统调用 │ │ ↓ │ │ CPU 从用户态切换到内核态 │ └──────────────┬─────────────────────────────────────────────────────┘ ↓ ┌──────────────────────────────────────────────────────────────────────┐ │ 内核态(Kernel Space) │ │ │ │ 1. 查中断描述符表 IDT,128 号条目 = 系统调用入口(sys_read) │ │ ↓ │ │ 2. sys_read() 执行:检查 PageCache 中是否有该文件的缓存页 │ │ ↓ │ │ ┌──────────────────┬────────────────────────────────┐ │ │ │ PageCache 命中 ✓ │ PageCache 未命中 ✗ │ │ │ │ ↓ │ ↓ │ │ │ │ 直接用 copy_to_user() │ 向磁盘驱动发起 I/O 请求 │ │ │ │ 把数据从 PageCache │ ↓ │ │ │ │ 拷贝到 app 的 buf │ 分配一个空 PageCache 页 │ │ │ │ ← 返回给 cat 进程 │ ↓ │ │ │ │ │ 配置 DMA 控制器(MMIO) │ │ │ │ │ ↓ │ │ │ │ │ DMA 从磁盘读取 → 写入 │ │ │ │ │ PageCache 页中 │ │ │ │ │ ↓ │ │ │ │ │ copy_to_user() 拷贝到 │ │ │ │ │ app 的 buf │ │ │ │ │ ← 返回给 cat 进程 │ │ │ └──────────────────────┴────────────────────────────────┘ │ └──────────────┬─────────────────────────────────────────────────────┘ ↓ ┌──────────────────────────────────────────────────────────────────────┐ │ 返回用户态(Return to User) │ │ │ │ cat 进程收到 read() 返回值,打印到 stdout → 终端屏幕 │ └──────────────────────────────────────────────────────────────────────┘

注意关键路径区分:

路径触发 DMA?触发中断?速度
PageCache命中❌ 不需要
http://www.jsqmd.com/news/777729/

相关文章:

  • 百度网盘提取码智能获取:3分钟告别密码搜索焦虑
  • 从Blender到3D打印机:3MF插件如何简化你的工作流程
  • 天津鑫汇达废旧物资回收:靠谱的天津废金属回收公司 - LYL仔仔
  • B 端表单页设计:从核心逻辑到落地实践
  • 创业团队如何利用Taotoken统一管理多个AI模型API密钥
  • Redis如何防范脑裂导致的数据丢失_配置min-replicas-to-write强制要求可用从节点数
  • 如何在5分钟内彻底解决OBS音频捕获难题:win-capture-audio实战指南
  • 财务公司哪个更可靠
  • 从宿舍恶作剧到通信系统原型:一次关于实验设计与信息编码的实践
  • 如何快速提升游戏体验:魔兽争霸3现代硬件兼容性完全指南
  • 抖音批量下载助手:一键获取全系列作品的终极解决方案
  • 最新免费匿名聊天室 PHP多人在线聊天室源码
  • 广东专业度高的LOGO设计公司:世答创意深度解析 - 奔跑123
  • 免费去水印工具推荐:2026 实测哪些网站、软件和 APP 能用?
  • 应对高并发场景Taotoken的稳定性与容灾路由实践
  • 深度解析:打破芯片壁垒,基于GB28181+RTSP的异构边缘计算AI视频架构实现
  • 揭秘芯片的“智能限流”术:如何让充电器在全球电压下稳定输出?
  • 工程师职业困境:从技术贵族到可替代零件,如何重构个人职业战略
  • 27《CAN总线隔离电路设计:从原理到实践,提升通信稳定性》
  • 手把手教你用TMS320F28377D的ePWM模块驱动永磁同步电机(附完整代码)
  • JS逆向 -最新版 某里(decode__1174盼之、md5__1803中兔日上、timestamp__1501拙政园、md5__1038雪球)醇酸
  • GPT-Image-2 如何用于电商主图与详情页素材生成
  • 别再只会用硬件IIC了!手把手教你用STM32的GPIO模拟IIC驱动AT24C02(附完整代码)
  • Mac NTFS写入终极指南:如何免费解锁Windows硬盘的完整读写权限
  • 别再搞混了!PyTorch和OpenCV处理RGB图像时,HWC和CHW格式到底怎么选?
  • 34_《智能体微服务架构企业级实战教程》提示词FastMCP服务之模板工具封装
  • AI也救不了你的毕业季?哪些降重软件可以同时降低查重率和AIGC疑似率?推荐一些可以用于论文降重的软件 | 附2026高效论文降重方案
  • 零数据上传的浏览器端PDF扫描效果生成器:LookScanned.io完整指南
  • 如何用嘎嘎降AI处理社会学论文:含大量访谈资料的定性研究降AI完整操作教程
  • 触觉智能RK3562开发板配置USB复合设备(下)