分类标签归档:linux

slab 伙伴分配器


slab 思想及编程接口

  1. slab核心思想 为每种对象类型创建一个内存缓存,每个内存缓存由多个大块组成,一个大块是一个或多个连续的物理页,每个包含多个对象。slab采用面向对象的思想,基于对象类型管理内存,每种对象被划分为一个类,比如进程描述符(task_struct)是一个类,每个进程描述符实现是一个对象

    内存缓存组成结构如下

  2. 编程接口

      //slab.h
        void * __must_check __krealloc(const void *, size_t,gfp_t);
        void * __must_check krealloc(const void *,siz

Read more

伙伴分配器


伙伴分配器

分区的伙伴分配器

当系统内核初始化完毕后,使用页分配器管理物理页,当使用的页分配器是伙伴分配器,伙伴分配器的特点是算法简单且高效

连续的物理页成为页块(page block)。阶(order)是伙伴分配器的一个专业术语,是页的数量单位,2^n个连续页成为n阶页块。

满足以下条件的两个n阶页块成为伙伴(buddy):

  1. 两个页块是相邻,即物理地址是连续的;
  2. 页块的第一页的物理页号必须是2^n的整数倍;
  3. 如果合并成(n+1)阶页块,第一页的物理页号必须是2^(n+1)的整数倍

伙伴分配器分配和释放物理页的数量单位为阶,分配n阶页块的过程如下:

  1. 查看是否有空闲的n阶页块,如果有直接分

Read more

引导内存分配器原理


引导内存分配器原理

内存分配node ,每个 node 有多个zone,每个zone 有很多个page 组成。

bootmem分配器

在内核初始化的过程中需要分配内存,内核提供临时的引导内存分配器,在页分配器和块分配器初始化完成之后,把空闲的物理页交给页分配器关联,丢弃引导内存分配器。

  1. bootmem 分配器定义的数据结构,内核源码如下
typedef struct bootmem_data {
    unsigned long node_min_pfn;//起始物理页号
    unsigned long node_low_pfn;//结束物理页号
    void *  node_b

Read more

物理内存组织结构


系统调用mmap

  1. 系统调用mmap用来创建内存映射,把创建内存映射主要工作委托给do_mmap函数,内核源码文件处理 :mm/mmap.c
  2. 虚拟内存区域使用其实地址和结束地址描述,链表按起始地址递增排序。
  3. 红黑树是自动平衡二叉树好处有1.查询方便,2.插入的时候避免全链表扫描
  4. 区别 在于: mmap 指定便宜的单位是字节,而mmap2 指定的单位是页。ARM64架构实现系统调用mmap

    sys_mmap 过程如下: 检查偏移是不是页的整数倍(如果偏移不是页的整数倍,直接返回-EINVAL,如果偏移是页的整数倍,那么把偏移转成页为单位的偏移,然后调用下面函数sys_mmap_pgof

Read more

内存映射原理


内存映射原理

内存映射的原理

创建内存映射时,在进程的用户虚拟地址空间中分配一个虚拟内存区域。内核采用延迟分配物理内存的策略,在进程第一次访问虚拟页的时候,产生缺页异常。如果是文件映射,那么分配物理页,把文件指定区间的数据读到物理页,然后再页表中把虚拟页映射到物理页,如果匿名映射,就分配物理页,然后在页表中把虚拟页映射到物理页

内存映射即在进程的虚拟地址空间中创建一个映射,分为两种:

  1. 文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件
  2. 匿名映射:没有文件支持的内存映射,把物理内存映射到里程的虚拟地址空间,没有数据源。

物理地址空间

物理地址是处

Read more