新闻详情

新闻详情

首页 / 资讯中心 / 详情

hotplug MAX_BLOCK_SIZE

发布时间:2026/9/30 8:55:05来源:尧图网络
hotplug MAX_BLOCK_SIZE
内存热插拔Memory Hotplug机制中允许的最大内存块大小。核心含义#define MAX_BLOCK_SIZE (2UL 30) // 2GBMAX_BLOCK_SIZE被定义为2GB2UL 30 2 × 2³⁰ 字节 2GB。这是内存热插拔/热移除操作中单个内存块可以拥有的最大尺寸。与MIN_MEMORY_BLOCK_SIZE的关系注释明确指出块大小block size必须满足两个条件是 2 的幂便于位运算和地址对齐。大于等于MIN_MEMORY_BLOCK_SIZE这是块大小的下限。MIN_MEMORY_BLOCK_SIZE通常与架构的页表层级有关。例如在 x86-64 上它可能被定义为PMD_SIZE2MB因为内存热插拔的粒度不能小于页表映射的粒度。因此块大小的合法范围是MIN_MEMORY_BLOCK_SIZE ≤ block_size ≤ MAX_BLOCK_SIZE。在内存热插拔中的作用内存热插拔以“块”为单位进行操作。每个块对应一个memory_block设备在/sys/devices/system/memory/下可见。块大小的选择需要在两个目标之间平衡块太小管理开销大memory_block设备数量多sysfs 节点爆炸。块太大无法精细地热插拔例如用户可能只想移除 4GB 内存但块大小是 8GB就无法精确操作。MAX_BLOCK_SIZE设为 2GB 是一个合理的上限既允许足够大的热插拔粒度又不会因为单个块过大而失去灵活性。这个值也与section的大小通常 128MB形成倍数关系便于 SPARSEMEM 模型管理。历史背景在早期内核中MAX_BLOCK_SIZE曾被定义为(1UL 30)1GB。后续补丁将其扩大到 2GB以支持更大的内存热插拔场景如大型虚拟化环境。这个变更也伴随着对block_size_bytes默认值的调整确保在支持大块的同时默认行为仍然合理。主要调用位置probe_memory_block_size()MAX_BLOCK_SIZE在 Linux 内核中的调用非常集中主要围绕x86 架构内存块大小的探测与决策。它的使用场景可以清晰地分为两类。这是MAX_BLOCK_SIZE最核心的使用场景位于arch/x86/mm/init_64.c。这个函数负责在启动时为 x86 系统决定内存热插拔块的大小。调用逻辑随着内核版本演进主要包含以下判断1. 裸机Bare Metal场景在较新的内核中如果系统运行在裸机上X86_HYPER_NATIVE或!cpu_feature_enabled(X86_FEATURE_HYPERVISOR)MAX_BLOCK_SIZE会被直接用作内存块大小。/* 来自 arch/x86/mm/init_64.c 的典型逻辑 */ if (hypervisor_is_type(X86_HYPER_NATIVE)) { bz MAX_BLOCK_SIZE; goto done; }2. 内存末端未对齐时的回退方案如果系统运行在虚拟化环境中且物理内存的末端boot_mem_end没有对齐到任何允许的块大小如 128MB、256MB 等内核会回退使用MAX_BLOCK_SIZE。这样做的目的是避免因使用过小的块如 128MB而导致在大型系统上生成海量的 sysfs 目录从而严重拖慢启动速度。/* 如果内存末端未对齐则使用最大块大小以最小化开销 */ if (!IS_ALIGNED(boot_mem_end, MIN_MEMORY_BLOCK_SIZE)) { bz MAX_BLOCK_SIZE; goto done; }3. 作为对齐搜索的起点在标准的对齐查找循环中MAX_BLOCK_SIZE被用作搜索的初始值从最大块开始向下寻找第一个能整除内存末端的块大小。/* 寻找能对齐内存末端的最大的允许块大小 */ for (bz MAX_BLOCK_SIZE; bz MIN_MEMORY_BLOCK_SIZE; bz 1) { if (IS_ALIGNED(boot_mem_end, bz)) break; }间接调用通过memory_block_size_bytes()MAX_BLOCK_SIZE本身是一个宏它不会直接被其他子系统调用。其他子系统如drivers/base/memory.c中的内存块设备管理代码是通过架构实现的memory_block_size_bytes()函数来获取块大小的。在 x86 架构上memory_block_size_bytes()的返回值正是由probe_memory_block_size()计算出来的而MAX_BLOCK_SIZE是这个计算过程中的关键上限。调用集中的原因MAX_BLOCK_SIZE的调用点如此集中是因为它本质上是 x86 架构的一个内部实现细节。内存热插拔的核心逻辑如offline_and_remove_memory需要知道“块”有多大但它们只调用抽象的memory_block_size_bytes()。具体的“块有多大”这个策略完全由 x86 的probe_memory_block_size()在启动时决定而MAX_BLOCK_SIZE就是这个决策过程中的一个重要参数。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

TensorFlow 2024实战指南:部署、量化与跨平台交付 2026/9/30 8:55:00

TensorFlow 2024实战指南:部署、量化与跨平台交付

1. 这不是“又一个深度学习框架”:TensorFlow在2024年的真实生存状态 你点开这篇文字,大概率不是因为想从零开始学AI——而是最近被三件事反复击中:第一次跑通TensorFlow模型时显存爆得莫名其妙;团队技术选型会上听到“PyTorch更灵…

阅读更多 →
OpenAPI 4.0重塑契约测试:模块化与消费者驱动实践 2026/9/30 8:55:00

OpenAPI 4.0重塑契约测试:模块化与消费者驱动实践

1. 你的契约为什么过了一道道检测,生产还是出了问题先从一个真实场景说起。过去一年我给不少做订单、支付、会员系统的团队做契约测试落地,发现一个反复出现的问题:OpenAPI 文件写得漂漂亮亮,lint 全绿,contract test …

阅读更多 →
Transformer 架构拆解:自注意力、位置编码与 PyTorch 实现避坑 2026/9/30 8:55:00

Transformer 架构拆解:自注意力、位置编码与 PyTorch 实现避坑

Transformer 火到今天这个程度,我见过不少朋友一上来就抄个nn.TransformerEncoderLayer就开始训模型,结果 loss 不降、注意力图全糊、显存爆得莫名其妙。说实话,模型结构理解不透,调参就是盲人摸象。这篇就干一件事——把 Transfo…

阅读更多 →
工业智能体:从架构设计走向全生命周期治理——小白程序员必看 2026/9/30 8:54:40

工业智能体:从架构设计走向全生命周期治理——小白程序员必看

工业智能体的发展正从“能回答问题”转向“能完成任务”,传统架构设计已无法满足现场需求。文章提出,工业智能体的下一站是全生命周期治理,通过明确职责、构建能力、验证上线、运行评估、迭代退役等阶段,对模型、知识、工具、行为…

阅读更多 →
通信网络考试核心考点:拓扑、交换、协议与性能指标精解 2026/9/30 8:54:39

通信网络考试核心考点:拓扑、交换、协议与性能指标精解

简介:本资源是一份面向计算机类考试考生的《现代通信网络复习总结》PDF讲义,聚焦通信网络核心考点梳理与应试强化,适用于考研、软考、通信工程师等专业认证备考场景。全文系统覆盖通信网分类(按业务、信号形式、服务范围等五维度&…

阅读更多 →
Java基础知识点复习笔记(上):数据类型、面向对象、字符串、集合与异常 2026/9/30 8:54:39

Java基础知识点复习笔记(上):数据类型、面向对象、字符串、集合与异常

“java基础知识点复习笔记(上)”——看到这个标题,我第一反应是:又要准备跳槽或者准备校招了吧。说实话,这些年我面试过不少人,也被别人面试过,一个Java开发者基础扎不扎实,往往聊不…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉