是否可以使用operator new来从堆以外的地方分配?

Ino*_*unx 5 c++ embedded memory-management

以下是我的应用程序的上下文:我正在使用嵌入式系统,该系统使用来自不同设备的RAM.微控制器内部RAM(128kB)中的一部分是外部RAM(1MB).这些存储器映射到微控制器的地址空间,但是在非连续区域中.

内部RAM用于系统堆栈,任务堆栈和堆.外部RAM用于静态分配的数据(池,缓冲区和所有" static ..."内容)

我正在尝试实现一个简单的内存管理结构,并且作为其中的一部分能够创建一个分配器,它可以使用分配算法,operator new但使用另一个内存源,而不是系统堆,而是其他地方的内存区域.你知道这是否可行?

使用的一个示例可以是保留100kB的外部RAM并创建一个分配器来管理它,然后将其分配给需要该内存的指定任务.

static const uint8_t* ramBase = reinterpret_cast<uint8_t*>(0x80000000);
static const uint32_t ramAreaSize = 0x19000; //100kB
BufferAllocator allocator(ramBase, ramAreaSize);

//...
//Assuming operator new is overloaded to use BufferAllocator
MyObject * obj = new (allocator) MyObject(some, parameter);
//...
Run Code Online (Sandbox Code Playgroud)

问题是:如何(如果这是可能的话)我可以实现BufferAllocator以便operator new用来管理原始内存区域?

void* BufferAllocator::allocate(uint32_t bytes)
{
    //I would like to write something like this
    //and so let the responsibility to manage this memory area to "new"
    //so I don't have to reimplement (or reuse) a different custom  
    // allocator
    return ::operator new(ramBase, ramAreaSize, bytes)
} 
Run Code Online (Sandbox Code Playgroud)

Ver*_*rax 1

我也遇到了同样的问题,我能找到的唯一解决方案就是编写自己的mallocfree. 我不需要任何特殊的东西,所以我只是按照 K&R 的C 编程语言中显示的代码建模(他们记录了一个简单的示例)。

然后我创建了两个堆:一个用于内部存储器,一个用于外部存储器。我的堆栈位于完全不同的内存块(STM32F4 上的 CCRAM)中,因此我不需要担心sbrk. 然而,我确实必须根据数据和 bss 段的大小知道内部 SRAM 堆的起始地址。这是根据extern链接描述文件注入的符号确定的。

我有足够的有关堆的信息来了解其当前大小、可用空间量以及是否有足够的连续内存来执行分配。如果内部 SRAM 不足,则会尝试外部 SRAM。如果内存不足,则与默认malloc内存不足没有什么不同。

我正在使用 GNU 工具链,因此我能够使用--wrap选项来覆盖 C 标准库的默认malloc, free, realloc, 和calloc(实际上malloc_r, free_r,realloc_r并且calloc_r因为我使用的是 newlib )。从那时new起,delete最终打电话malloc给朋友,我就能让它发挥作用(至少满足我的需要)。

我对这种方法不是很有信心,但这是我在能力范围内能做的最好的事情。仔细考虑。

我有兴趣了解一个更简单的解决方案。