uClinux中的动态分配

时间:2012-06-07 15:42:20

标签: c++ c virtual-memory uclinux mmu

我是嵌入式开发的新手,传统Linux和uClinux之间的差异在于uClinux缺少MMU。

来自this article

  

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

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

还是我在思考它?或者过度简化它?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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