Linux 什么';在低ram嵌入式系统中使用Busybox的意义是什么

Linux 什么';在低ram嵌入式系统中使用Busybox的意义是什么,linux,arm,embedded,cortex-m,busybox,Linux,Arm,Embedded,Cortex M,Busybox,我正致力于将linux带到一个定制的Cortex-M7板上,该板具有16MB的SDRAM和64MB的闪存。该平台没有MMU、共享库和平面可执行文件 使用非常简单的init.d shell脚本启动Busybox系统时遇到问题。通过执行简单的shell命令,如“[”或“printf”,系统内存不足。结果表明,每次执行其中一个命令时,系统都需要加载完整、唯一的busybox可执行文件(在我的系统上为650 Kb) 因此,问题是:如果系统总是必须为busybox中执行的每个命令在内存中加载一个巨大的可执

我正致力于将linux带到一个定制的Cortex-M7板上,该板具有16MB的SDRAM和64MB的闪存。该平台没有MMU、共享库和平面可执行文件

使用非常简单的init.d shell脚本启动Busybox系统时遇到问题。通过执行简单的shell命令,如“[”或“printf”,系统内存不足。结果表明,每次执行其中一个命令时,系统都需要加载完整、唯一的busybox可执行文件(在我的系统上为650 Kb)

因此,问题是:如果系统总是必须为busybox中执行的每个命令在内存中加载一个巨大的可执行文件,那么这有多方便?我不明白在快速耗尽ram的同时节省一些兆字节的廉价和丰富的存储空间,但也许我忽略了一些东西

我的平台是Busybox的一个用例吗?如果不是,是否有任何东西可以方便地在各自的可执行文件上构建linux系统实用程序

提前谢谢

编辑:

Busybox,据他们自己说,“在编写时考虑到了大小优化和有限的资源”,因此成为嵌入式系统中一种无可置疑的事实标准。但是他们的声明与RAM(而非存储)受限系统上的上述问题有何关系?我认为这值得一些澄清

跟进,系统详情:


内核已经为XIP编译,从64 Mb外部闪存执行。整个读/写ext3根文件系统(包括busybox二进制文件)现在驻留在micro SD卡上。busybox可执行文件使用平面格式(“bFLT”)在启用load to RAM位的情况下,该位似乎会在每次运行并发命令时在不同的内存块上产生新的负载,直到耗尽合适的块为止。将busybox(整个/bin,/sbin)放在XIP文件系统上的建议非常棒,肯定会提高执行速度(当然,这个新的文件系统需要驻留在64 Mb的外部闪存上)。我从未尝试过在这样的文件系统上执行“bFLT”(也不知道它是否有效)但是我会对此进行研究/测试。

TL-DR;Linux拥有庞大的基础设施和各种可用的rootfs或引导文件系统。之所以选择,是因为适应了不同的系统约束和最终用户功能。Busybox对于目标系统来说是一个不错的选择,但如果系统工程师不使用它,任何软件都可能被误用是时候了解它了


我的平台是Busybox的用例吗

如果您花时间最小化内核大小和
busybox
本身,这是非常重要的。您不太可能需要当前
busybox
中的所有功能

如果没有,是否可以方便地在各自的可执行文件上构建linux系统实用程序

请参阅下面的klibc信息。您还可以构建。许多文件系统构建器支持共享库或静态二进制文件。但是,文件系统构建器可能以包管理和实时更新为目标

更多细节 您可以使用busybox配置功能。其思想是所有配置的功能都是必需的。因此,您需要将它们全部放在内存中。使用busybox,
ls
mkdir
printf
,等等都是相同的二进制文件。因此,如果您运行一个shell脚本,一个代码加载就是所有代码加载。另一方面,您有许多sep创建二进制文件,每一个都会占用额外的内存。你需要最小化Linux以获得更多的RAM,你可以从
busybox
中提取功能以使其更小。busybox就像一个巨大的共享库;或者更准确地说是一个
共享进程。所有代码页都是一样的

定制Cortex-M7板,具有16 Mb SDRAM和64 Mb闪存

一个也是唯一一个busybox可执行文件(在我的系统上为650 Kb)

显然650KB远小于16MB。您没有说其他RAM的用途。另一个好的替代方法是查看。不清楚的是闪存是否为NAND/NOR以及是否启用了XIP。通常,使用XIP闪存时,
busybox
会更好,而
klibc
会更好(且更有限)仅适用于SDRAM,闪存中有一些文件系统

请参阅:在Busybox常见问题解答中。它被设计为从只读内存运行,这可能是一个很大的增益,取决于系统结构。它可能提供比klibc更丰富的功能集,因为该项目的目标只是引导一些其他装载设备(硬盘驱动器、SSD等)

Klibc没有busybox那么多的文档。它可以是一个共享库,也可以是静态链接的。每个二进制文件将只使用静态链接任务所需的RAM,但这将占用更多的闪存空间。带有Klibc的二进制文件是

1. dash 2. chroot 3. dd 4. dmesg 5. mkdir 6. mkfifo 7. mknode 8. pivot_root 9. unmount 10. true 11. false 12. sleep 13. ln 14. ls 15. mv 16. nuke 17. minips 18. cat 19. uname 20. halt 21. kill 22. cpio 23. sync 24. readlink 25. gzip 26. losetup 1.破折号2.chroot 3.dd 4.dmesg 5.mkdir 6.mkfifo 7.mknode 8.pivot_root 9.unmount 10.true 11.false 12.sleep 13.ln 14.ls 15.mv 16.nuke 17.minips 18.cat 19.解除20.停止21.终止22.cpio 23.同步24.读取链接 25.gzip 26.losetup 就是这样!没有网络,没有媒体播放器等。您可以编写代码来使用klibc,但它是一个非常受限的库,可能没有您需要的功能。通常它仅限于磁盘任务。例如,探测USB以便从外部设备启动非常好


Busybox可以做更多的事情。大多数klibc静态二进制文件将在100kB以下;通常为10-30kB。Dash和gzip更大。但是,我认为您需要从内核中删除配置项,因为650KBBusybox的要点是,您只需要在内存中有一个(共享)可执行文件

你写道:

事实证明,每次执行其中一个命令时,系统都需要加载完整的、唯一的busybox可执行文件(在我的系统上为650 Kb)

这不完全是真的