Linux内存隔离后接口使用情况
Linux下通过soft_offline_page隔离后,哪些接口还可以使用对应的物理内存
在Linux系统中,使用soft_offline_page
隔离内存页后,对应物理内存的可用性取决于操作结果:
成功迁移页面:
- 物理内存状态:原页面被释放回伙伴系统(Buddy System),标记为可用。
- 可使用的接口:所有常规内存分配接口(如用户空间的
malloc
、mmap
,内核的kmalloc
、get_free_pages
等)可以重新分配该内存。此时物理内存被回收,后续访问是安全的。
迁移失败(标记为HWPoison):
- 物理内存状态:页面被标记为硬件损坏(HWPoison),保留在系统中但不可用。
- 访问行为:任何访问尝试(用户态或内核态)将触发
SIGBUS
信号(用户进程)或内核错误(如VM_BUG_ON
)。内存不会被再次分配,接口无法正常使用该内存。
总结:
- 若
soft_offline_page
成功迁移并释放页面,所有内存分配接口可重新使用该物理内存。 - 若失败且标记为HWPoison,所有访问接口均会触发错误,内存被永久隔离。
Linux内核中被标记为HWPoison的内存,什么接口可以访问这部分内存
在Linux内核中,被标记为HWPoison
的内存页会被内核严格隔离,任何常规接口都无法安全访问这部分内存。其行为和处理方式如下:
1. 用户态访问
- 触发信号:用户态进程尝试访问被标记为
HWPoison
的内存时,会触发SIGBUS
信号(总线错误),默认行为是终止进程。 - 示例场景:
- 进程通过
malloc
分配的堆内存被标记为HWPoison
后,访问该内存会崩溃。 - 内存映射文件(
mmap
)的页面被标记为HWPoison
时,读写操作会直接失败。
- 进程通过
2. 内核态访问
- 触发内核错误:内核代码(如驱动或子系统)访问
HWPoison
页时,可能触发kernel panic
或BUG_ON
,导致系统崩溃或错误日志记录。 - 内核保护机制:
- 内核通过
PageHWPoison(page)
标志检查页面状态。 - 访问前会调用
check_hwpoison_page()
等函数进行验证,若发现页面异常,会主动拒绝访问。
- 内核通过
3. 内存分配接口
- 隔离机制:
HWPoison
页面会被移出伙伴系统(Buddy System)和Slab分配器,无法通过常规接口(如kmalloc
、get_free_pages
或用户空间的malloc
)再次分配。- 内核的页框回收机制(如kswapd)会跳过这些页面。
4. 特殊场景与底层工具
- 物理地址直接访问:
- 理论上,通过内核调试工具(如
/dev/mem
或kdb
)直接访问物理地址可能绕过逻辑地址映射,但会触发以下问题:- 硬件异常:若底层硬件检测到损坏内存,可能引发Machine Check Exception (MCE),导致系统重置。
- 数据不可靠:即使强行读取,内容可能是损坏的或无意义的。
- 工具限制:
mcelog
或rasdaemon
等工具会记录HWPoison
事件,但不会主动访问这些页面。- 内核的
hardware poisoning
机制会阻止对这些页面的操作。
- 理论上,通过内核调试工具(如
5. 诊断接口
- 信息查询:
- 通过
/proc/vmstat
可查看nr_hwpoison
统计值,确认系统是否存在HWPoison
页。 - 调试内核时,可用
PageHWPoison(page)
宏检查特定页是否被标记。
- 通过
- 主动触发:
- 内核开发者可通过
memory_failure()
函数模拟内存错误,但仅用于测试和诊断。
- 内核开发者可通过
总结
访问方式 | 行为与结果 |
---|---|
用户态常规访问 | 触发SIGBUS ,进程终止。 |
内核态常规访问 | 触发内核错误(BUG_ON 或panic )。 |
内存分配接口 | 页面已被隔离,无法分配。 |
物理地址直接访问 | 可能触发硬件异常,数据不可靠,无实际意义。 |
诊断工具 | 可查询统计信息,但无法直接读写内存内容。 |
被标记为HWPoison
的内存页会被内核永久隔离,无安全或官方支持的接口可访问其内容。此类机制旨在防止数据损坏或系统不稳定,通常需要替换硬件(如故障内存条)后重启系统以恢复可用内存。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!