c++ - uClinux 中的动态分配

标签 c++ c virtual-memory uclinux mmu

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

来自 this article :

Without VM, each process must be located at a place in memory where it can be run. In the simplest case, this area of memory must be contiguous. Generally, it cannot be expanded as there may be other processes above and below it. This means that a process in uClinux cannot increase the size of its available memory at runtime as a traditional Linux process would.

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

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

最佳答案

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

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

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

关于c++ - uClinux 中的动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935187/

相关文章:

c++字符串,构建删除字符 'b'并将字符 'a'替换为两个 'd'的函数

c++ 代码在 FreeBSD 上没有捕获异常

c - 这个具体示例是否是 C99 中 restrict 关键字的未定义行为?

c - 格式化和未格式化字符串 C

c - 专家 - GCC 和 ld 链接器 : re-initialization of variables contained in . 数据部分?

c++ - C++11 中一个好的 std::string 跨平台 UTF8 替代品?

c# - 使用 C# 从 RLM 读取许可文件(C++ 到 C# 的翻译)

c++ - 为什么 sizeof 运算符对数组产生不同的结果

c - 从/proc/<pid>/pagemap 转储 pfn 未提供预期的内容

c - 多次读取未初始化的值是否总是会给出相同的值?