Linux 的memblock 内存管理器

Linux 的memblock 内存管理器

最近接触到了linux 在启动阶段的内存管理器memblock, 它是bootmem 的后续者。 本来想自己写一篇关于memblock的文章的, 但看到了这篇文章, 就把它翻译过来了:https://0xax.gitbooks.io/linux-insides/content/MM/linux-mm-1.html# 。

简介

内存管理是操作系统最复杂的子系统之一(而我认为不需要加之一)。 在 kernel 入口前的最后准备 一节中, 我们在start_kernel 之前停了下来。 你可能还记得我们在启动阶段创建早期的page tables,identity page tables 和 fixmap page tables。复杂的内存管理还没有工作。 当start_kernel 开始运行时, 我们将看到向更复杂的数据结构和技术的转变。为了更好地了解内核的初始化过程, 我们需要对这些技术有一个清晰的理解。 本章首先从memblock开始, 详细介绍Linux 内存管理的框架及其API。

Memblcok

在自举阶段, 通用的内存管理器还没有建立起来的时候, memblock 是管理内存区域的方法之一。 原先它叫做 Logical Memory Block, 经过了Yinghai Lu 的补丁之后, 它被命名为memblock。 由于linux x86_64 内核使用该技术, 我们已经在 kernel 入口前的最后准备 中遇到过它了。 现在我们更仔细地考察它是如何实现的。

我们先从memblock 相关的数据结构开始 。 它们定义在头文件 include/linux/memblock.h 里:

第一个结构是 memblock:

struct memblock {
   
         bool bottom_up;
         phys_addr_t current_limit;
         struct memblock_type memory;   --> array of memblock_region
         struct memblock_type reserved; --> array of memblock_region
#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
         struct memblock_type physmem;
#endif
};

该结构包含5个成员: bootom_up 为 true 的时候表明自底向上分配内存。 current_limit 是 memory block 的限制尺寸。 接下来的三个成员表示memory block的类型, 它们可以是: memory, reserved 和 physical memory(当CONFIG_HAVE_MEMBLOCK_PHYS_MAP 使能时)。 然后我们看另一个数据结构 - memblock_type:

struct memblock_type {
   
    unsigned long cnt;
    unsigned long max;
    phys_addr_t total_size;
    struct memblock_region *regions;
};

该结构提供关于内存类型的信息。 它包含成员描述memory region 在当前memory block里的个数和尺寸, 以及指向memblock_region 的指针。 而memblock_region 结构描述一块内存区域:

struct memblock_region {
   
        phys_addr_t base;
        phys_addr_t size;
        unsigned long flags;
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
        int nid;
#endif
};

它提供了内存区域的基地址和大小, 还有一个标志域, 可能的值有:

enum {
   
    MEMBLOCK_NONE    = 0x0,    /* No special request */
    MEMBLOCK_HOTPLUG    = 0x1,    /* hotpluggable region */
    MEMBLOCK_MIRROR    = 0x2,    /* mirrored region */
    MEMBLOCK_NOMAP    = 0x4,    /* don't add to kernel direct mapping */
};

如果CONFIG_HAVE_MEMBLOCK_NODE_MAP定义了, 还有一个 numa 节点选择项 nid。

我们可以用下图表示以上三个数据结构的关系:

+---------------------------+   +---------------------------+
|         memblock          |   |                           |
|  _______________________  |   |                           |
| |        memory         | |   |       Array of the        |
| |      memblock_type    |-|-->|      memblock_region      |
| |_______________________| |   |                           |
|                           |   +---------------------------+
|  _______________________  |   +
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值