arm-none-eabi-gcc 9.2如何实现malloc/free?

问题描述 投票:0回答:1

我正在arm-none-eabi-gcc源代码中寻找malloc()和free()的实现细节。我观察到 malloc()/free() 函数可以在 STM32 上运行,无需操作系统和任何额外的实现。

所以我想了解 malloc 在裸机系统上的 arm-none-eabi-gcc 中如何工作。源码中底层是如何实现的?

据我了解,使用 malloc 通常需要实现 _sbrk_r 或 _malloc_r 等函数。然而,就我而言,它似乎无需显式实现这些功能即可工作。

我检查了几个 .c 文件,例如 malloc.c、mallocr.c、nano-mallocr.c,我认为这些文件可能与 gcc 源目录中的 malloc 实现有关。但我无法确认文件中的这些函数是否确实是由malloc()调用来实现分配功能的。

c embedded malloc newlib arm-none-eabi-gcc
1个回答
0
投票

GCC 没有实现 malloc。这是 C 标准库的一部分。

裸机 ARM 微控制器上常用的 C 库是 newlib

你是对的,malloc 依赖于 _sbrk_r,而 _sbrk_r 又是 brk 或 _brk 的线程安全版本。

典型的 brk 实现通常保留一个状态字,它是指向堆末尾的指针。每次您请求更多堆时,它都会递增该指针并返回其先前的值。

堆末尾的初始值是使用链接描述文件中定义的符号设置的。传统上这称为 _end 或 end。

所以也许让 malloc 工作所需的只是一个定义 _end 的 Liker 脚本。 STM32Cube 中的就是这样做的。

有时还有一个符号表示堆不能增长的点,并且 brk 实现也可能会检查这一点。您必须查看 C 库的源代码,看看您是否属于这种情况。

如果不这样做,那么 malloc 将始终返回不断增加的指针,但最终它们将指向内存末尾之外,并且事情将停止按您的预期工作。

传统上,在某些嵌入式系统上,堆向上增长到与堆栈从另一端向下增长到的同一内存块中。在这种情况下,使用 malloc 分配太多内存将导致堆栈溢出,您可以将返回的指针与堆栈指针进行比较,以了解距离发生这种情况有多近。

© www.soinside.com 2019 - 2024. All rights reserved.