struct boot_params与memmap=的关系 📅 2026/8/16 8:25:08 struct boot_params和memmap内核参数之间是信息源头与信息过滤器的关系。boot_params特别是其核心的e820_table提供了硬件报告的完整内存布局而memmap参数则允许在这个布局上添加一层来自用户的“覆盖规则”用来修改内核最终采纳的内存视图。这个关系类似于boot_params是一张由BIOS/UEFI绘制好的“原始地图”而memmap是在这张地图上画出的“自定义红线”内核最终的行动将遵循被红线修改过的地图。信息源头boot_params提供硬件视角struct boot_params中的e820_table是内核了解物理内存布局最核心的数据来源。它由引导程序如GRUB在启动时根据固件信息填充包含了系统完整的E820内存映射表详细描述了每块内存区域的起始地址、大小和类型如可用RAM、保留内存等。这是内核最信任的硬件原始信息。信息过滤器memmap注入用户视角memmap参数是内核启动命令行中的一个选项允许在boot_params提供的原始地图上应用修改。它的核心作用就是覆盖或调整E820表所描述的内存区域。常见的用法包括限制最大可用地址memmapnn[KMG]不带偏移量或mem参数会限制系统可以使用的最大物理地址任何超出该限制的内存区域都会被内核移除。保留或指定特定区域通过memmapnnss等格式可以将指定区域标记为保留或可用这会影响内核的最终内存视图。协同工作用户规则覆盖硬件数据在启动过程中内核会按照以下流程协同处理这两者获取硬件数据内核首先从boot_params中读取固件提供的E820表。解析用户规则内核解析命令行中的memmap参数。应用覆盖内核根据memmap的规则对原始的E820表进行修改、删除或新增条目。建立最终视图基于修改后的内存表内核构建其最终的内存管理视图如初始化memblock分配器。一个更现代和稳健的做法是当内存条数过多时超过boot_params固定的128个E820表容量引导程序或内核可以通过setup_data链表来传递扩展的内存映射信息而不是依赖受限的命令行。这也从侧面体现了boot_params作为基础数据结构的核心地位。