uClinux 中的动态分配
Dynamic allocation in uClinux
我是嵌入式开发的新手,我看到传统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
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- uClinux 中的动态分配