【发布时间】:2012-03-09 05:58:09
【问题描述】:
这个查询是关于使用malloc分配内存的。
一般我们所说的malloc从堆中分配内存。
现在说我有一个普通的嵌入式系统(没有操作系统),我加载了正常的程序,我在我的程序中执行malloc。
在这种情况下,内存是从哪里分配的?
【问题讨论】:
标签: c embedded memory-management
这个查询是关于使用malloc分配内存的。
一般我们所说的malloc从堆中分配内存。
现在说我有一个普通的嵌入式系统(没有操作系统),我加载了正常的程序,我在我的程序中执行malloc。
在这种情况下,内存是从哪里分配的?
【问题讨论】:
标签: c embedded memory-management
malloc() 是一个通常由运行时库实现的函数。没错,如果您在操作系统之上运行,那么 malloc 有时(但不是每次)会触发系统调用,使操作系统将一些内存映射到程序的地址空间中。
如果您的程序在没有操作系统的情况下运行,那么您可以将您的程序视为是操作系统。您可以访问所有地址,这意味着您只需将地址分配给指针,然后取消引用该指针以进行读/写。
当然,您必须确保程序的其他部分不只是使用相同的内存,因此您编写自己的内存管理器:
简单地说,您可以留出一个地址范围,您的 "memory-manager" 用来存储哪些地址范围已经在使用(存储在其中的数据结构可以是像链表一样容易或更复杂)。然后你将编写一个函数并调用它,例如malloc(),它构成了内存管理器的功能部分。它查看提到的数据结构以找到与参数指定的范围一样长的地址并返回指向它的指针。
现在,如果您的程序中的每个函数都调用您的 malloc() 而不是随机写入自定义地址,那么您已经完成了第一步。您可以编写一个 free() 函数,该函数将查找它在提到的数据结构中给出的指针,并调整数据结构(在简单的链表中它将合并两个链接)。
【讨论】:
唯一真正的答案是“无论您的编译器/库实现放在哪里”。
在我使用的嵌入式系统中,没有堆,因为我们还没有写过。
【讨论】: