首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >uClinux中的动态分配

uClinux中的动态分配
EN

Stack Overflow用户
提问于 2012-06-07 15:42:20
回答 3查看 1.1K关注 0票数 4

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

来自这篇文章

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

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

还是我想得太多了?还是简化了它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-08 20:51:01

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-06-07 20:21:24

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

票数 0
EN

Stack Overflow用户

发布于 2016-06-03 12:00:22

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10935187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档