【问题标题】:Is there a different memory allocation path other than the buddy allocator in linux?linux中除了buddy allocator之外还有其他的内存分配路径吗?
【发布时间】:2021-07-21 12:46:20
【问题描述】:

我正在了解 Linux 中的内存分配,并为我的实验对伙伴分配器 (__alloc_pages_nodemask) 进行了一些更改。我在struct page->flags 中创建了一个新标志(通过在page-flags.h 中的enum pageflags 中添加一个新标志。我在 __alloc_pages_nodemask 中永久设置了这个位(一旦设置就不会被清除,并且在所有进一步的分配和释放中仍然存在。我修改 PAGE_FLAGS_CHECK_AT_PREP以确保它)。但我无法看到预期的行为。

我猜这是因为 Linux 也在使用一些不同的路径来分配内存(可能在引导期间)。我的假设正确吗?

除了buddy allocator之外还有什么不同的内存分配路径吗?我在哪里可以找到它?

【问题讨论】:

  • 您看到的行为是什么?让我想起了不久前的my own question

标签: c linux memory memory-management linux-kernel


【解决方案1】:

我在内核邮件列表上问过这个问题。 David / dhildenb replied 他的回答很有帮助。

memblock 是引导期间的早期内存分配器,在伙伴之前 已启动并正在运行。范围分配器(例如,alloc_contig_range())是 某种建立在伙伴之上的机制。其他 allcoators (hugetlb,slab, ...) 可能会缓存一些页面,但是 通过 memblock 或伙伴有效地获取“物理内存”。

CMA 是另一种特殊用途的分配器,它保留物理 通过 memblock 存储区域,然后使用范围分配器 实际上在运行时在这些保留区域内分配内存。

可以在mm/memblock.c 中找到 memblock 的完整文档和 API。

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 2015-12-08
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多