malloc是否需要OS支持?

dou*_*leE 3 c embedded operating-system memory-management firmware

内存管理是底层操作系统提供的服务.当我们调用malloc()/free()并且没有运行的操作系统时(例如裸机嵌入式系统),如何处理内存分配和跟踪?

应该有一个实体可以跟踪哪些地址是免费的,哪些地址不是.这是OS内存管理单元.malloc()/free()然后必须调用OS系统调用.所以没有OS意味着没有malloc()/free().假设这个我错了吗?

更新:

所有答案都指出,malloc/free可以使用静态池分配(当没有OS可用时)或使用sbrk/brk哪些是内核系统调用.问题是如何malloc/free知道下面是否有内核?

答案(见"Kuba Ober"评论,见下面的回答):

malloc不需要知道任何东西,因为你链接你的项目的C库是特定于目标的:如果你为Linux开发,你使用Linux的C库,不同于为OS X或Windows开发时,或裸骨ARM Cortex M0.或者,哎呀,准系统x86.编写C库的人员知道如何实现它,以便它可以在所需的目标上运行.例如,x86的准系统C库将使用EFI和ACPI查询硬件或BIOS未使用的可用RAM块列表,然后使用它们来完成分配请求.

dus*_*uff 7

malloc()并且free()不需要OS支持.它们可以(通常是!)在裸机系统上实现.例如,Arduino库使用malloc()free()管理字符串.

在托管实现中(即,在操作系统上运行的应用程序),malloc()并且free()通常将使用操作系统服务来分配新的内存" - 通常一次只有几兆字节" - 并返回那些帅哥未使用时的操作系统.通过将这些内存块切割成应用程序所需的大小来处理较小的分配.这允许在没有系统调用开销的情况下管理小分配.

在一个非主机实现(如裸机系统)中,应用程序已经可以访问系统中存在的所有内存,并且可以根据需要分配该内存的块.

在较低级别:托管和非托管实现malloc()通常通过将每个已分配或未分配的内存块视为链接列表中的条目来工作.这通常通过在每次分配开始之前存储结构来完成,例如

struct malloc_block {
    struct malloc_block *prev, *next;
    size_t size;
    ...
    char allocation[];
};
Run Code Online (Sandbox Code Playgroud)

并返回一个指针allocation作为返回值malloc().功能,如realloc()free()可以通过从一个指向分配减去结构的大小检索的结构.

  • @Novice通常是系统构建器通过在链接时明确标识要用作"免费存储"(堆)的RAM的地址和长度来实现的.C运行时库启动将根据其特定实现的要求"格式化"该区域,提高应用程序所需的操作免费存储所需的结构. (2认同)

use*_*003 6

Malloc/free 函数管理内存池。这些功能一般不是操作系统服务。

\n\n

那么这个池是如何创建的呢?

\n\n

在大多数系统上,malloc 调用操作系统服务将页面映射到进程地址空间,以创建和扩展内存池。如果调用 malloc,并且没有可用内存,大多数实现将调用系统服务来映射更多内存并扩展池。

\n\n

malloc 实现需要维护数据结构来跟踪池中哪些内存是空闲的以及哪些内存已分配。这是通过许多不同的方式完成的。对于程序员来说,选择最适合他们的 malloc/free 组合并将其链接到他们的应用程序中并不罕见。

\n\n

所以,是的,通常涉及操作系统\xe2\x80\x94。

\n\n

但你问到是否可以在没有操作系统的情况下实现它们。

\n\n

假设你做了:

\n\n
   static char pool [POOLSIZE] ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

在你的 malloc 实现中。那么您就不需要系统服务在执行期间创建池。另一方面,您的池有固定的大小。

\n