不同的内核在同一台机器上报告不同的总内存量

不同的内核在同一台机器上报告不同的总内存量

我有两个 x86_64 内核在同一台机器上针对相同的代码编译(4.15.0 inLinus 的源代码树)。

配置文件是通过make localmodconfig针对该源运行而生成的,使用来自不同发行版的不同的、更大的原始配置文件:分别是 Arch 和 Slackware。我会给他们起个昵称

配置

斯尔克 配置

是因为。

问题:运行cat /proc/meminfo一致报告 MemTotal 字段中大约多出 55-60 MB斯尔克:

MemTotal: 32600808 kB为了

MemTotal: 32544992 kB为了斯尔克

我说“一致”是因为我已经尝试使用相同的配置文件对早期版本的源进行实验(一堆 4.15-rc 内核,之前的 4.14 等,从一个源滚动到下一个源make oldconfig) 。

这反映在 htop 报告的数据中,其中斯尔克报告启动时的使用量比。这与htop 开发者的解释htop 的已用内存数据如何基于MemTotal.

我的问题是:对于我应该查看哪些配置选项会产生影响,有什么建议吗?

我当然不介意 60MB(运行内核的机器有 32 GB..),但这对我来说是一个有趣的难题,我想将其用作学习机会。

Linux 上的内存报告在这些论坛和外部广泛讨论,但搜索这种特定类型的问题(不同内核/同一台机器 => 内存报告中的不同结果)并没有产生任何我发现相关的内容。


编辑

根据 @ErikF 链接的帖子中的建议,我查看了以下输出

journalctl --boot=#

其中#代表0或-1,分别代表当前和上一次启动(对应两个内核)。这些线条似乎确实反映了差异,所以现在我更清楚它的来源:

(报告较大 MemTotal 的那个):

内存:32587752K/33472072K 可用(10252K 内核代码、1157K rwdata、2760K rodata、1364K init、988K bss、884320K 保留、0K cma 保留)

斯尔克(报告较小 MemTotal 的那个):

内存:32533996K/33472072K 可用(14348K 内核代码、1674K rwdata、3976K rodata、1616K init、784K bss、938076K 保留、0K cma 保留)

正如预期的那样,差异约为 55 MB!

我知道斯尔克内核更大,通过比较 /boot/ 文件夹中两个 vmlinuz 文件的大小进行验证,但差异的主要部分似乎来自两个各自的内核保留的内存量。

我想更好地了解配置文件中的影响在一定程度上确实如此,但这确实揭示了一些线索。


第二次编辑

回答@Tim Kennedy 评论中的问题。

您有专用 GPU,还是使用共享显存

无专用GPU;这是一台带有板载英特尔显卡的笔记本电脑。

两个内核是否加载相同的图形驱动程序?

是的,i915。

另外,比较 dmesg | 的输出grep BIOS-e820 | grep BIOS-e820 | grep BIOS-e820 | grep BIOS-e820 grep 保留

正如您所期望的,没有改变。在所有情况下,它都是 12 行,在各个方面(内存地址等)都相同。


(最终?)编辑

我相信事情可能就这么简单:内核报告的 MemTotal 较少很多更多内置驱动程序套件;我只是没有意识到它会产生如此明显的变化..

我比较了:

du -sh /lib/modules/<smaller-kernel>/modules.builtin

返回 4K,同时

du -sh /lib/modules/<larger-kernel>/modules.builtin

返回 16K。

所以最后,我相信我找错了树:它不会是单个配置选项(或少数),而是更多内置驱动程序的累积效果。

答案1

我相信这张照片就像我上面最后一次编辑的那样;当我问这个问题时,我只是对保留内存的过程了解不够,无法实现:这一切都归结为更大的内核内置了更多驱动程序,而不是模块化。

顺便说一句,我确实想将其用于一些(远程)实际用途:我希望拥有尽可能精简的内核,但仍然在没有 initrd 的情况下启动它。我知道

  • 较小的内核(绰号上面)非常轻量且启动速度快,但并非没有 initramfs;

  • 较大的内核(斯尔克将要无需 initramfs 即可启动,但需要更长的时间。

所以我做出了妥协,我想我现在会坚持下去。我拿了两个配置文件,调用它们大的小的,并确保每个未设置的配置选项小的体现在大的

第一的,

awk '/^# CO/ {print} small > staging'

抓取所有行小的配置文件的形式为

# CONFIG_BLAH is not set

并将它们倾倒在分期文本文件。然后,

for i in $(awk '{print $2}' staging) ; do sed -i "s/^$i=./# $i is not set/" large ; done

从配置文件中获取所有行大的设置(通过=y=m)包含在中的选项分期并取消设置它们。

然后我运行make oldconfig生成的文件大的放在内核源码目录中并编译。一切顺利:

  • 新内核启动速度快了约 3 秒

  • 没有 initramfs

  • /lib/modules/<kernel>/modules.builtin从 16K 减半到 8K 的意义上说,它要小得多。


这些没什么好写的,但正如我所说,这让我感到困惑……我想我现在已经解决了这个问题。

想必更直接的做法就是一劳永逸地弄清楚恰恰我需要在这台机器上使用哪些驱动程序才能在没有 initramfs 的情况下启动,但我将把它留到另一天。此外,将一种配置与另一种配置进行比较本身就是一项有趣的练习。

相关内容