4

我是嵌入式开发的新手,我发现传统 Linux 和 uClinux 之间的最大区别是 uClinux 缺少 MMU。

这篇文章

如果没有 VM,每个进程都必须位于内存中可以运行的位置。在最简单的情况下,这个内存区域必须是连续的。一般来说,它不能扩展,因为它上面和下面可能还有其他进程。这意味着 uClinux 中的进程无法像传统 Linux 进程那样在运行时增加其可用内存的大小。

对我来说,这听起来像是所有数据都必须驻留在堆栈上,而且堆分配是不可能的,这意味着 malloc() 和/或“new”是不可能的……这准确吗?也许有允许管理“静态堆”(即可以请求“动态”分配的基于堆栈的区域)的技术/库?

还是我想多了?还是过度简化?

4

3 回答 3

4

在常规 Linux 下,程序员不需要处理物理资源。内核负责这一点,用户空间进程只能看到自己的地址空间。随着堆栈的增长,或者发出 malloc 类型的请求,内核会将空闲内存映射到进程的虚拟地址空间。

在 uClinux 中,程序员必须更关心物理内存。MMU 和 VM 不可用,所有地址空间都与内核共享。当加载用户空间程序时,会为进程分配用于文本、堆栈和变量的物理内存页。进程的程序计数器、堆栈指针和数据/bss 表指针设置为物理内存地址。堆分配(通过 malloc 类型调用)是从同一个池中进行的。

您不必摆脱程序中的堆分配。您将需要关注一些新问题。由于堆栈无法通过虚拟内存增长,因此您必须在链接期间正确调整其大小以防止堆栈溢出。内存碎片成为一个问题,因为没有 MMU 来整合较小的空闲页面。错误指针变得更加危险,因为它们现在可能导致对物理内存中任何位置的意外写入。

于 2012-06-08T20:51:01.133 回答
0

我使用 uCLinux 已经有一段时间了(在它被集成到主树之前),但我认为 malloc 仍然可以作为 c 库的一部分使用。由于堆不是孤立的,因此在内存中执行非常糟糕的事情(tm)的可能性要高得多,但这是可能的。

于 2012-06-07T20:21:24.453 回答
0

是的,您可以在 uclinux 上的用户空间应用程序中使用 malloc,但是您必须增加用户空间应用程序的堆栈大小(在运行程序之前导致堆栈大小是静态的),这样当 malloc 运行时它将获得空间需要。例如,arm-cortex arm 工具链上的 uclinux 提供了查找和更改用户应用程序二进制文件使用的堆栈大小的命令,然后您可以将其传输到您的嵌入式系统并运行 ----- > arm-uclinuxeabi-flthdr

于 2016-06-03T12:00:22.087 回答