uClinux 中的动态分配

Dynamic allocation in uClinux

本文关键字:动态分配 uClinux      更新时间:2023-10-16

我是嵌入式开发的新手,我看到传统Linux和uClinux之间的巨大区别是uClinux缺乏MMU。

从这篇文章:

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

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

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

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

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

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

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

是的,您可以在UCLINUX上的用户空间应用程序中使用malloc,但是您必须增加用户空间应用程序的堆栈大小(在运行程序之前,因为堆栈大小将是静态的),以便当malloc运行时它将获得所需的空间。例如手臂皮层上的UCLINUXARM工具链提供命令来查找和更改用户应用程序二进制使用的堆栈大小,然后您可以将其传输到嵌入式系统并运行-----> arm-uclinuxeabi-flthdr