这个问题涉及使用 malloc
来分配内存。
通常情况下,我们说 malloc
从堆中分配内存。
现在假设我有一个普通的嵌入式系统(没有操作系统),我加载了一个普通的程序,在程序中使用了 malloc
。
那么在这种情况下,内存是从哪里分配的呢?
这个问题涉及使用 malloc
来分配内存。
通常情况下,我们说 malloc
从堆中分配内存。
现在假设我有一个普通的嵌入式系统(没有操作系统),我加载了一个普通的程序,在程序中使用了 malloc
。
那么在这种情况下,内存是从哪里分配的呢?
malloc()是一个通常由运行时库实现的函数。如果你在操作系统之上运行,那么malloc有时会(但并不总是)触发一个系统调用,使操作系统将一些内存映射到程序的地址空间中。
如果你的程序在没有操作系统的情况下运行,那么你可以把你的程序看作是操作系统。你可以访问所有地址,这意味着你可以将一个地址赋给指针,然后对它进行解引用以读写数据。
当然,你必须确保程序的其他部分不会使用同样的内存,因此你需要编写自己的内存管理器:
简单地说,你可以设置一系列地址,供你的 "内存管理器" 使用,用于存储哪些地址范围已经被使用(存储在其中的数据结构可以是链表或更复杂的结构)。然后,你将编写一个函数,例如 malloc(),作为内存管理器的功能部分。该函数查找上述数据结构,以找到与参数指定相同长度的可用地址范围,并返回指向它的指针。
现在,如果你的程序中的每个函数都调用你的 malloc() 而不是随机地写入自定义地址,那么你已经完成了第一步。你可以编写一个 free() 函数,在上述数据结构中查找给定的指针,并调整数据结构(在简单的链表中,它将合并两个链接)。