ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

struct boot_params与memmap=的关系

2026/8/16 8:38:31 拓冰建站 浏览量
struct boot_params与memmap=的关系

struct boot_paramsmemmap=内核参数之间,是信息源头信息过滤器的关系。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表所描述的内存区域。常见的用法包括:

  • 限制最大可用地址memmap=nn[KMG](不带偏移量)或mem=参数,会限制系统可以使用的最大物理地址,任何超出该限制的内存区域都会被内核移除。

  • 保留或指定特定区域:通过memmap=nn@ss等格式,可以将指定区域标记为保留或可用,这会影响内核的最终内存视图。

协同工作:用户规则覆盖硬件数据

在启动过程中,内核会按照以下流程协同处理这两者:

  1. 获取硬件数据:内核首先从boot_params中读取固件提供的E820表。

  2. 解析用户规则:内核解析命令行中的memmap=参数。

  3. 应用覆盖:内核根据memmap=的规则,对原始的E820表进行修改、删除或新增条目。

  4. 建立最终视图:基于修改后的内存表,内核构建其最终的内存管理视图(如初始化memblock分配器)。

一个更现代和稳健的做法是,当内存条数过多时(超过boot_params固定的128个E820表容量),引导程序或内核可以通过setup_data链表来传递扩展的内存映射信息,而不是依赖受限的命令行。这也从侧面体现了boot_params作为基础数据结构的核心地位。