news 2026/9/29 20:45:30

Linux的缺页异常居然可以睡眠?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux的缺页异常居然可以睡眠?

导言

有的同学问:缺页异常不是一种中断异常?中断异常难道不是原子上下文?为什么还可以睡眠?

答案:缺页异常并非原子上下文,而是由明确上下文触发的“同步异常”。下面我们详细分析用户地址与内核地址缺页异常各自的上下文情况。

一、用户地址缺页异常

性质:同步异常,由进程访问用户态虚拟地址触发,运行在明确的进程上下文中。

上下文:与系统调用类似,不是原子上下文,抢占未被禁用,preempt_count正常。

可否睡眠:✅ 可以。缺页处理路径中允许:

  • 获取mmap_read_lock(甚至mmap_read_lock_killable)

  • 调用alloc_pages(GFP_KERNEL)分配物理页

  • 执行 swap I/O 换入页面

  • 等待锁、等待内存回收

信号响应:mmap_read_lock_killable()允许在等待锁时被SIGKILL终止。

原子上下文中的例外:若进程在持有自旋锁或pagefault_disable()期间访问用户内存,缺页处理被faulthandler_disabled()拦截,通过异常表修复返回-EFAULT,不会睡眠。


二、内核地址缺页异常

性质:内核访问内核空间地址(如 vmalloc 区域、直接映射区)时触发。

上下文:取决于代码路径,可能处于进程上下文,也可能处于原子上下文。

可否睡眠:

  • 非原子上下文:✅ 允许。如 vmalloc 按需填充页表时,可分配页表页、睡眠等待。

  • 原子上下文:❌ 禁止。若发生,直接 Oops 或返回错误。

关键保障:

  1. 现代 x86_64 的vmalloc()立即填充页表,返回后访问不再缺页,因此常规使用无需担心上下文。

  2. x86_32 或特定架构仍可能存在 vmalloc 惰性映射,此时必须由开发者保障:确保访问发生在非原子上下文,或页表已预填充。

  3. vmap()、ioremap()等也可能有惰性映射行为,同样需要开发者确认上下文。

原子上下文中访问用户内存的预期缺页:

  • 即使是copy_from_user这种预期内的缺页,若发生在原子上下文,faulthandler_disabled()为真,缺页处理被拒绝,通过异常表返回-EFAULT,不会睡眠。


三、统一判断入口:faulthandler_disabled()

c

#define faulthandler_disabled() (pagefault_disabled() || in_atomic())
  • pagefault_disabled():显式调用了pagefault_disable()。

  • in_atomic():处于中断上下文、持有自旋锁、禁用了抢占。

只要该宏为真,缺页处理一律被拒绝:

  • 用户态:返回SIGSEGV或SIGBUS。

  • 内核态:通过异常表修复返回-EFAULT,或直接 Oops。


四、最终结论

缺页类型上下文可否睡眠保障方
用户地址缺页进程上下文,非原子✅ 可以内核缺页处理程序自动处理
内核态访问用户内存(预期内)非原子✅ 可以内核缺页处理程序
内核态访问用户内存(原子上下文)原子❌ 禁止异常表返回-EFAULT
内核态访问 vmalloc(x86_64)非原子(页表已建)✅ 可以vmalloc()已预填充页表
内核态访问 vmalloc(惰性映射)非原子✅ 可以开发者需确保非原子上下文
内核态访问 vmalloc(原子上下文)原子❌ 禁止会 Oops
内核态野指针任意❌ 禁止Oops / Panic

一句话总结:用户地址缺页是进程上下文中的同步异常,可以睡眠;内核地址缺页是否允许睡眠取决于是否在原子上下文以及页表是否已建立。现代 x86_64 的vmalloc()已预填充页表,常规访问不会缺页;但惰性映射场景下,开发者必须自行保障访问不在原子上下文中,否则会触发 Oops。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 20:45:29

星闪NearLink仓储监测组网实战:明治AKU Air部署调优与避坑指南

1. 仓储监测的无线组网困局与星闪的切入逻辑做过仓储环境监测的人都有一个共同感受:项目最难的部分从来不是传感器本身,而是数据怎么稳定地传回来。仓库这个场景太特殊了——高货架密集排列、金属货架对无线信号形成天然屏蔽、叉车和人员频繁移动造成多径…

作者头像 李华
网站建设 2026/9/29 20:45:27

控制层IT/OT融合:软件PLC+TSN+AI实战解析

IT/OT 融合这个词,做工厂自动化的兄弟都不陌生。但顶层 PLC 到 MES 的数据打通只是开胃菜,真正的硬骨头在最后 100 米——控制层。软件 PLC 要换掉老式控制器,确定性网络要走通实时数据,AI 要进到控制逻辑旁边,这三件事…

作者头像 李华
网站建设 2026/9/29 20:45:19

PDF拆分合并最全教程!电脑手机通用,零基础一键搞定

日常办公、学习、求职中,PDF拆分和合并是超高频需求!整理简历、拼接资料、拆分长篇报告、提取指定页面,几乎每天都能用到。很多人要么找不到靠谱工具,要么操作复杂、导出带水印,甚至担心文件隐私泄露。今天整理一套零门…

作者头像 李华
网站建设 2026/9/29 20:45:12

B200多卡通信卡死排查:Fabric Manager版本不一致导致NVLS初始化失败

1. 问题现场与背景还原8张B200跑NCCL all-reduce,进程挂起,日志停在NVLS初始化阶段,这是我在一个GPU集群交付现场遇到的真实故障。当时客户催得紧,8卡机器跑单机通信测试直接卡死,nvidia-smi看GPU利用率全是0&#xff…

作者头像 李华
网站建设 2026/9/29 20:42:01

python的先进制造技术工业场景模拟第十九篇:加载3D打印成型温度场采样数据,统计模型不同区域的最高,最低成型温度。

周三上午,增材制造实验室。"这批件又翘边了,"工艺工程师小周拿着一盒刚从 SLS 设备上取下来的尼龙件,"三个角翘起来了,底面不是平面。我怀疑是温度场不均匀——激光烧结的时候,边缘区域温度降得太快&am…

作者头像 李华