没有操作系统的嵌入式系统中的malloc

时间:2012-02-17 20:30:35

标签: c embedded memory-management

此查询涉及使用malloc分配内存。

通常我们所说的是malloc从堆中分配内存。

现在说我有一个普通的嵌入式系统(没有操作系统),我在我的程序中malloc加载了正常的程序。

在这种情况下,从哪里分配内存?

3 个答案:

答案 0 :(得分:9)

malloc()是一个通常由运行时库实现的函数。你是对的,如果你在操作系统上运行,那么malloc有时会(但不是每次都)触发一个系统调用,使OS将一些内存映射到你程序的地址空间。

如果您的程序在没有操作系统的情况下运行,那么您可以将您的程序视为 操作系统。您可以访问所有地址,这意味着您只需为指针分配一个地址,然后将该指针取消引用即可读/写。

当然,你必须确保程序的其他部分不是只使用相同的内存,所以你要编写自己的内存管理器:

简单地说,你可以预留“内存管理器”用来存储哪些地址范围的地址范围(存储在那里的数据结构可以是容易作为链表或更复杂)。然后你会写一个函数并调用它,例如 malloc(),它构成了内存管理器的功能部分。它查看提到的数据结构,以查找范围的地址,只要参数指定并返回指向它的指针。

现在,如果程序中的每个函数都调用malloc()而不是随机写入自定义地址,那么您已经完成了第一步。你可以编写一个 free() -function,它将查找在上述数据结构中给出的指针,并调整数据结构(在天然链表中,它将合并两个链接)。

答案 1 :(得分:5)

唯一真正的答案是“编译器/库实现的任何地方”。

在我使用的嵌入式系统中,没有堆,因为我们还没有写过。

答案 2 :(得分:4)

正如你所说的那样。不同之处在于操作系统不提供堆。您的应用程序的链接器脚本无疑将包含堆的分配。运行时库将管理它。

如果Newlib C库经常用于基于GCC的嵌入式系统,而不是运行操作系统或至少没有运行Linux,那么该库有一个名为sbrk()的存根syscall函数。开发人员可以实现sbrk()的强大功能,它必须根据请求为堆管理器提供更多内存。通常,它仅增加指针并返回指向新块开始的指针,此后库的堆管理器管理和维护新块,该新块可能与先前块相邻或不相邻。上一个链接包含一个示例实现。