在Bootpimage的情况下,initrd真的会减少内核映像的大小吗?
根据维基百科关于initrd的文章,“ 许多Linux发行版都提供了一个单一的通用内核映像 - 这个发行版的开发人员所打算的映像将尽可能多地引导硬件,这个通用内核映像的设备驱动程序作为可加载模块因为将许多驱动程序静态编译到一个内核中会导致内核映像变得更大,可能太大而无法在内存有限的计算机上引导,从而导致在启动时检测并加载挂载根文件系统所需模块的问题,或者为此,推断根文件系统的位置或内容为了避免必须为许多特殊情况对内核进行硬编码处理,使用了一个具有临时根文件系统的初始启动阶段(现在称为早期用户空间) 。这个根文件系统可以包含用户空间帮助程序,这些帮助程序负责进行硬件检测,模块加载和设备发现,以获取安装的真实根文件系统。 “
我的问题是,如果我们添加模块等需要加载实际的文件系统在initrd中而不是在实际的内核映像来保存保存,那么我们将在Bootpimage中将内核和initrd组合起来形成单个bootpimage的情况下实现。 即使使用initrd,内核的大小也会增加。
有人可以澄清吗?
定义“内核的大小”。
是的,如果你有一个最小的内核映像加上一个包含数百个模块的initrd,它可能会占用更多的总体存储空间,而不是等同的内核,其中包含所有的模块头文件等。 然而,一旦它被引导,确定它正在运行什么硬件,加载了几个模块并将所有其余的(initrd中的init )抛出,它将占用更少的内存 。 另一方面,内置的内置映像一旦被引导,内存仍然与磁盘一样大,因此浪费了所有不需要的驱动程序代码。
存储几乎总是比RAM更便宜,更丰富,因此一旦系统运行,以减少可用内存为代价优化存储空间通常会有点愚蠢。 即使对于网络启动,为了启动稍微快一点而牺牲总体映像大小的运行时功能也没什么意义。 几乎可以肯定这种考虑可能具有任何优点的几种系统首先不会使用通用多平台内核。
有几个方面的规模 ,这可能令人困惑。
运行时间大小
TL-DR; 在模块中使用initrd为通用映像提供了当前(3.17)Linux内核代码的最小运行时内存占用空间。
我的问题是,如果我们添加模块等需要加载实际的文件系统在initrd中而不是在实际的内核映像来保存保存,那么我们将在Bootpimage中将内核和initrd组合起来形成单个bootpimage的情况下实现。 即使使用initrd,内核的大小也会增加。
无论您选择哪种机制,您的数据传输都是相同的。 实际上,带有模块加载的initrd将比完全静态链接的内核更大,启动时间会更慢。 听起来很糟糕。
为设备专门构建并且不包含额外硬件驱动程序或模块支持的定制内核始终是最佳选择。 关于内核编译的Debian手册给出了两个使用可能想要制作自定义内核的原因。
第二个选项通常是最关键的参数。 最大限度地减少正在运行的内核消耗的内存量。 initrd (或initramfs )是作为RAM磁盘加载的二进制磁盘映像。 这是所有用户代码的唯一任务,即探测设备并使用模块加载为系统获取正确的驱动程序。 完成这项工作后,它会挂载一个真正的启动设备或正常的根文件系统。 发生这种情况时, initrd映像将被丢弃。
initrd不消耗运行时内存。 您可以同时获得通用映像和运行时间足迹极小的映像。
我会说,发行人做出的努力偶尔会产生性能问题。 通常,ARM驱动程序仅针对一个 SOC编译; 尽管消息来源支持SOC家族,但只有一个可以通过条件选择。 在更新的内核中,ARM驱动程序始终支持整个SOC系列。 内存开销很小。 但是,使用低级驱动程序传输函数的函数指针可能会限制控制器的带宽。
cacheflush例程有一个用于多缓存的选项。 函数指针会导致编译器自动溢出。 但是,如果您编译特定的缓存类型,编译器可以内联函数。 这通常会生成更好更小的代码。 大多数司机都没有这种类型的基础设施。 但是如果您编译针对您的CPU进行调优的单片内核,您将拥有更好的运行时行为。 几个关键的内核函数将使用内联函数。
编译到内核时,驱动程序通常不会更快。 许多系统支持通过USB,PCMCIA,SDIO等进行热插拔。这些系统在模块加载时也具有内存优势。
链接地址: http://www.djcxy.com/p/66797.html上一篇: Do initrd really reduce kernel image size in case of Bootpimage?