内存

优质
小牛编辑
129浏览
2023-12-01

内存

[KNL,BOOT]
mem=nn[KMG]
强制指定内核使用多少数量的内存。仅在你想限定内存使用量时,才需要指定这个选项。同时为了避免PCI设备使用指定范围之外的内存,你还应该配合"memmap="一起使用。
[KNL]
memmap=exactmap
表示将要使用随后的"memmap=..."等选项进行精确的E820内存映射(因为有时候E820报告的并不准确),同时禁止内核进行任何自动的探测。比如对于一个4G内存的机器可能是:"memmap=exactmap memmap=640K@0 memmap=4095M@1M"。
[KNL]
memmap=nn[KMG]@ss[KMG]
强制只使用从ss开始的nn长度的特定内存区域。可以多次使用以指定多个区域。
[KNL,ACPI]
memmap=nn[KMG]#ss[KMG]
强制将从ss开始的nn长度的特定内存区域标记为ACPI数据。
[KNL,ACPI]
memmap=nn[KMG]$ss[KMG]
强制保留(不使用)从ss开始的nn长度的特定内存区域。
[KNL,BUGS]
reserve=起点,长度[,起点,长度]...
禁止设备驱动程序自动探测某些iomem区域,因为某些设计不良的硬件会导致自动探测失败或出错。此外,还可以用于人为禁止内核初始化某些端口上的设备。
内核会将此处指定的iomem区域标记为"reserved"(意为"已经在此处找到设备"),从而将该区域保留。
因为设备驱动不应该去侦测标记为"reserved"的区域,除非另一个启动选项明确地指示它这样做,所以此选项经常和其它启动选项一起使用:
用"reserve="保留一段区域禁止所有其他驱动的探测,同时再明确指定一个驱动去检测被保留的区域。例如:

reserve=0x300,32  blah=0x300

的意思是:除了允许"blah"驱动探测 0x300 之外,禁止任何其他驱动探测 0x300-0x31f 区域。
绝大部份的机器都不需要此选项。只有真正有缺陷的硬件或特殊情况才会需要使用它。
[注意]每个"reserve="选项最多可以指定4个保留区域,如果你有异常复杂的需求,可以使用多重"reserve="来指定。

reservelow=nn[K]
设置为BIOS保留的底端地址空间数量。
memory_corruption_check={0|1}
是否开启低位内存脏数据检查(CONFIG_X86_CHECK_BIOS_CORRUPTION)。某些有bug的BIOS经常会在执行系统休
眠/唤醒之类动作的时候,破坏内存中前64k的内容。如果始终检查到错误,那么就应该通过"memmap="选项来避免使用这段内存。
memory_corruption_check_size=字节数
低位内存脏数据检查(CONFIG_X86_CHECK_BIOS_CORRUPTION)的内存范围。默认值是"64K",表示"0-64K"这个内存范围。
memory_corruption_check_period=秒数
低位内存脏数据检查(CONFIG_X86_CHECK_BIOS_CORRUPTION)的周期。默认值是60秒。设为"0"则表示禁止这种周期性的检查。
[KNL,BOOT]
vmalloc=nn[KMG]
强制指定vmalloc区域的大小。可用于增加vmalloc区域的最小尺寸(x86默认128MB),也可以用于减少vmalloc的大小,增加更多的空间用于直接映射内核RAM。
[SLUB]
slub_min_order=整数
slub_max_order=整数
SLUB页块最小与最大order数(默认值分别是"0"与"3"),当然slub_min_order必须小于slub_max_order。每一个slab需要2order个物理页框。过高的值可能会导致内存溢出错误。详见Documentation/vm/slub.txt
[SLUB]
slub_min_objects=整数
每个slab的最小object总数目(默认值是"4")。详见Documentation/vm/slub.txt
[SLUB]
slub_nomerge
禁止合并大小相近的多个slab,主要用于调试目的。
[KNL]
dhash_entries=正整数
设置内核目录项缓存中哈希表默认项数。仅供内核专家使用。
[KNL]
ihash_entries=正整数
内核会在内存中缓存一定数量的inode结构来加速文件访问,每个inode对应一个文件(不同于文件系统中的inode概念),包含文件访问权限/属主/组/大小/生成时间/访问时间/最后修改时间等信息。这些inode保存在一个哈希表中。
这个值用于指定这个哈希表的最大项数。你可以根据自己硬盘上可能被访问的文件数量对默认值进行调整(注意需要考虑哈希值的碰撞)。仅供内核专家使用。
[KNL]
transparent_hugepage={always|madvise|never}
设置透明大内存页(CONFIG_TRANSPARENT_HUGEPAGE)的默认用法:
always 表示总是对所有应用程序启用透明大内存页支持
madvise 表示仅对明确要求该特性的程序启用
never 表示彻底禁用。
其默认值由内核的编译时设置决定。详见"Documentation/vm/transhuge.txt"文档。
[HW]
default_hugepagesz={2M|1G}
默认的HugeTLB页大小。若未指定,那么其默认值就是CPU自身的默认值。
大多数现代计算机体系结构提供对多页面大小的支持,比如X86_64支持4K和2M(要求CPU带有"pse"标记)以及1G(要求CPU带有"pdpe1gb"标记)。
因此Linux将物理内存划分成许多固定大小的页面(默认为4K),每个页对应一个page结构,这些结构组成一个mem_map[]数组。
TLB(Translation Lookaside
Buffer)是虚拟地址到物理地址的翻译缓冲区,这种缓冲区在处理器上是很宝贵的,操作系统总是尝试将有限的TLB资源发挥到极致。特别是能够轻松获得
若干G内存的时候(大于4G),这种优化就显得尤为关键。而HugeTLB特性则允许将某些页的尺寸增大到2MB或1GB,从而大大减小TLB的尺寸,提
高缓冲区的命中率,进而提升内存性能。
[HW]
hugepagesz={2M|1G}
指定HugeTLB页的大小,通常与"hugepages="联合使用(可使用多次),为不同尺寸的大页分别预留不同的数量。
例如:hugepagesz=2M hugepages=128 hugepagesz=1G hugepages=8
注意:1GB的大页只能在命令行上使用"hugepages="预先分配,且分配之后不可在运行时释放。
[HW]
hugepages=正整数
在启动时分配的HugeTLB页数量,仅在内核开启了CONFIG_HUGETLBFS之后有效。
gbpages
nogbpages
是否允许内核页表对大小为1GB的Hugepages进行直接映射(CONFIG_DIRECT_GBPAGES)。当"CONFIG_DIRECT_GBPAGES=y"时,默认值是"gbpages"。
vdso={0|1|2}
vdso=0 禁用VDSO(Virtual Dynamic Shared Object)映射
vdso=1 启用VDSO(Virtual Dynamic Shared Object)映射,这是"CONFIG_COMPAT_VDSO=n"时的默认值。
vdso=2 将VDSO(Virtual Dynamic Shared Object)映射到旧式的确定性地址,这是"CONFIG_COMPAT_VDSO=y"时的默认值。
vdso32={0|1|2}
vdso32=0 禁用32位VDSO(Virtual Dynamic Shared Object)映射
vdso32=1 启用32位VDSO(Virtual Dynamic Shared Object)映射,这是"CONFIG_COMPAT_VDSO=n"时的默认值。
vdso32=2 将32位VDSO(Virtual Dynamic Shared Object)映射到旧式的确定性地址,这是"CONFIG_COMPAT_VDSO=y"时的默认值。