con*_*roy 4 linux embedded arm busybox cortex-m
我正在努力将 linux 引入具有 16 Mb SDRAM 和 64 Mb 闪存的定制 Cortex-M7 板。该平台没有 MMU,没有共享库,没有 FLAT 可执行文件。
我在使用非常简单的 init.d shell 脚本启动 Busybox 系统时遇到问题。通过执行诸如“[”或“printf”之类的简单shell命令,系统就会耗尽内存。事实证明,每次执行这些命令之一时,系统都需要加载 FULL、一个且唯一的 busybox 可执行文件(在我的系统上为 650 Kb)。
所以问题是:如果系统总是要为在busybox 中执行的每个命令都在内存中加载一个巨大的可执行文件,那么这有多方便?我不明白在极快地退出内存的同时节省几兆字节的廉价和丰富的存储空间,但也许我忽略了一些东西。
我的平台是 Busybox 的用例吗?如果没有,是否有任何东西可以方便地在自己的可执行文件上构建 linux 系统实用程序?
提前致谢!
编辑:
根据他们自己的说法,Busybox “在编写时考虑了大小优化和有限的资源”,因此成为嵌入式系统中一种毋庸置疑的事实上的标准。但是他们的声明与 RAM(而非存储)受限系统上的上述问题有何关联?我相信这值得一些澄清。
跟进,系统详情:
内核已经为 XIP 编译,从 64 Mb 外部闪存执行。整个读/写 ext3 根文件系统(包括 busybox 二进制文件)现在驻留在微型 SD 卡上。Busybox 可执行文件使用 FLAT 格式(“bFLT”)并启用加载到 RAM 位,该位似乎在每次运行并发命令时在不同的内存块上导致新的加载,直到它耗尽拟合块。将busybox(整个/bin、/sbin)放在XIP 文件系统上的建议非常棒,它肯定会提高执行速度(当然,这个新文件系统需要驻留在64 Mb 外部闪存上)。我从未尝试过在这样的文件系统上执行“bFLT”(也不知道它是否有效),但我会对此进行研究/测试。
TL-DR; Linux 拥有庞大的基础设施和各种可用的 rootfs 或引导文件系统。选择是由于适应不同的系统约束和最终用户功能。Busybox 是目标系统的不错选择,但如果系统工程师不花时间了解它,任何软件都可能被滥用。
我的平台是 Busybox 的用例吗?
如果你花时间来最小化内核大小和busybox它本身。您不太可能需要当前busybox.
如果没有,是否有任何东西可以方便地在自己的可执行文件上构建 linux 系统实用程序?
请参阅下面的 klibc 信息。您还可以使用 musl、buildroot 和 busybox构建破折号。许多文件系统构建器支持共享库或静态二进制文件。但是,文件系统构建器可能会针对许多目标,例如包管理和实时更新。
您可以在busybox之外配置功能。这个想法是需要所有配置的功能。因此,您需要将它们全部保存在内存中。对于busybox,ls、mkdir、printf等都是相同的二进制文件。因此,如果您运行 shell 脚本,则一次代码加载就是所有代码加载。另一方面,您有许多单独的二进制文件,每个文件都会占用额外的内存。您需要最小化 Linux 以获得更多 RAM,并且您可以移除功能busybox以使其更小。Busybox 就像一个巨大的共享库;或更准确地说shared process。所有代码页都相同。
带有 16 Mb SDRAM 和 64 Mb 闪存的定制 Cortex-M7 板
...
一个且唯一的 busybox 可执行文件(在我的系统上为 650 Kb)
显然650KB远小于16MB。您没有说明其他 RAM 的用途。另一个不错的选择是查看klibc 工具套件。不清楚的是 FLASH 是否为 NAND/NOR 以及您是否启用了 XIP。通常,busybox使用 XIP 闪存klibc会更好,仅适用于 SDRAM 会更好(并且更受限制),在闪存中有一些文件系统。
请参阅:Busybox FAQ 中的可重定位代码、PIC 和静态链接使用的内存。它被设计为从只读内存运行,这取决于系统结构,这可能是一个很大的收益。它可能提供比 klibc 更丰富的功能集,因为该项目的目标只是启动其他一些挂载设备(硬盘驱动器、SSD 等)。
Klibc 没有busybox 那么多的文档。它可以是共享库或静态链接。每个二进制文件将仅使用静态链接任务所需的 RAM,但这将占用更多闪存空间。带有 klibc 的二进制文件是,
1. 破折号 2. chroot 3. dd 4. dmesg 5. mkdir 6. mkfifo 7. mknode 8. pivot_root 9. 卸载 10. 真 11. 假 12. 睡眠 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. 丢失
这就是它!没有网络,没有媒体播放器等。您可以编写代码来使用 klibc,但它是一个非常受限制的库,可能没有您需要的功能。通常它仅限于磁盘任务。例如,探测 USB 以获取外部设备的引导非常好。
Busybox 可以做更多的事情。大多数 klibc 静态二进制文件都在 100kB 以下;典型值为 10-30kB。Dash 和 gzip 更大。但是,我认为您需要从内核中删除配置项,因为 650KB << 16MB 并且即使没有 XIP,busybox 也是该系统的不错选择。
我还应该指出,Linux 对 MMU 系统的代码确实“要求页面加载”。即使您没有交换,代码也可能会被踢出 RAM 并在稍后因页面错误而重新加载。你的系统没有 MMU,所以在这种情况下,busybox 不会表现得很好。有了 mmu 和“按需页面加载”,它会做得更好。
对于严格的限制,您始终可以编写完全免费的二进制文件。这避免了您可能不需要的 libgcc 启动和支持基础设施。通常,这仅适用于测试内核与 initrd 问题以及必须在许多不同库环境中运行的脚本/二进制文件。
也可以看看:
XIP 只能与 ROM、NOR 闪存和可能的SPI-NOR MTD 一起使用。