文章目录

  • 一、memblock_alloc 函数分析
  • 二、memblock_alloc_base 函数分析
  • 三、__memblock_alloc_base 函数分析
  • 四、memblock_alloc_base_nid 函数分析
  • 五、memblock_alloc_range_nid 函数分析

memblock 分配器提供了如下编程接口 :

① 添加内存 : memblock_add 函数 , 将 内存块区域 添加到 memblock.memory 成员中 , 即 插入一块可用的物理内存 ;

② 删除内存 : memblock_remove 函数 , 删除 内存块区域 ;

③ 分配内存 : memblock_alloc 函数 , 申请分配内存 ;

④ 释放内存 : memblock_free 函数 , 释放之前分配的内存 ;

在之前的博客中介绍了 memblock_add memblock_remove 函数源码 , 本篇博客开始介绍 memblock_alloc 分配内存函数 ;

一、memblock_alloc 函数分析


memblock_alloc 函数 的作用是 在 指定地址之前 分配一块物理内存 ;

memblock_alloc 函数 定义在 Linux 内核源码的 linux-4.12\mm\memblock.c#1242 位置 ;

phys_addr_t __init memblock_alloc(phys_addr_t size, phys_addr_t align)
{return memblock_alloc_base(size, align, MEMBLOCK_ALLOC_ACCESSIBLE);
}

源码路径 : linux-4.12\mm\memblock.c#1242

memblock_alloc 函数 中 , 调用了 memblock_alloc_base 函数 ;

二、memblock_alloc_base 函数分析


memblock_alloc_base 函数 中 , 调用了 __memblock_alloc_base 函数 ,

目的是 获取一块 可用物理内存 , 如果执行成功 , 则获取的 物理内存区域 首地址为 000 ;

memblock_alloc_base 函数参数说明 :

  • phys_addr_t size 参数 用于 指明要分配的 物理内存大小 ;
  • phys_addr_t align 参数 表示 对齐方式 ;
  • phys_addr_t max_addr 参数 表示 可分配物理地址的 最大值 , 也就是说必须在该地址之前分配 物理内存 ;
phys_addr_t __init memblock_alloc_base(phys_addr_t size, phys_addr_t align, phys_addr_t max_addr)
{phys_addr_t alloc;alloc = __memblock_alloc_base(size, align, max_addr);if (alloc == 0)panic("ERROR: Failed to allocate %pa bytes below %pa.\n",&size, &max_addr);return alloc;
}

源码路径 : linux-4.12\mm\memblock.c#1230

三、__memblock_alloc_base 函数分析


__memblock_alloc_base 函数 中 , 调用了 memblock_alloc_base_nid 函数 ;

__memblock_alloc_base 函数参数说明 :

  • phys_addr_t size 参数 用于 指明要分配的 物理内存大小 ;
  • phys_addr_t align 参数 表示 对齐方式 ;
  • phys_addr_t max_addr 参数 表示 可分配物理地址的 最大值 , 也就是说必须在该地址之前分配 物理内存 ;
phys_addr_t __init __memblock_alloc_base(phys_addr_t size, phys_addr_t align, phys_addr_t max_addr)
{return memblock_alloc_base_nid(size, align, max_addr, NUMA_NO_NODE,MEMBLOCK_NONE);
}

源码路径 : linux-4.12\mm\memblock.c#1223

四、memblock_alloc_base_nid 函数分析


memblock_alloc_base_nid 函数 中 , 调用了 memblock_alloc_range_nid 函数 ;

memblock_alloc_base_nid 函数参数说明 :

  • phys_addr_t size 参数 用于 指明要分配的 物理内存大小 ;
  • phys_addr_t align 参数 表示 对齐方式 ;
  • phys_addr_t max_addr 参数 表示 可分配物理地址的 最大值 , 也就是说必须在该地址之前分配 物理内存 ;
  • int nid 参数 表示 新区域的 nid , 指向 NUMA 结构 ;
  • unsigned long flags 参数 表示 新加入 内存块 的 标志位 ;
static phys_addr_t __init memblock_alloc_base_nid(phys_addr_t size,phys_addr_t align, phys_addr_t max_addr,int nid, ulong flags)
{return memblock_alloc_range_nid(size, align, 0, max_addr, nid, flags);
}

源码路径 : linux-4.12\mm\memblock.c#1200

五、memblock_alloc_range_nid 函数分析


memblock_alloc_range_nid 函数参数说明 :

  • phys_addr_t size 参数 用于 指明要分配的 物理内存大小 ;

  • phys_addr_t align 参数 表示 对齐方式 ;

  • phys_addr_t start 参数 用于 指明要分配的 物理内存 起始地址 ;

  • phys_addr_t end 参数 用于 指明要分配的 物理内存 结束地址 ;

  • int nid 参数 表示 新区域的 nid , 指向 NUMA 结构 ;

  • unsigned long flags 参数 表示 新加入 内存块 的 标志位 ;

memblock_alloc_range_nid 函数源码如下 :

static phys_addr_t __init memblock_alloc_range_nid(phys_addr_t size,phys_addr_t align, phys_addr_t start,phys_addr_t end, int nid, ulong flags)
{phys_addr_t found;if (!align)align = SMP_CACHE_BYTES;found = memblock_find_in_range_node(size, align, start, end, nid,flags);if (found && !memblock_reserve(found, size)) {/** The min_count is set to 0 so that memblock allocations are* never reported as leaks.*/kmemleak_alloc_phys(found, size, 0, 0);return found;}return 0;
}

源码路径 : linux-4.12\mm\memblock.c#1170

【Linux 内核 内存管理】memblock 分配器编程接口 ④ ( memblock_alloc 函数 | memblock_alloc_base 函数 )相关推荐

  1. 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

    文章目录 一.do_mmap 函数执行流程 二.do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 & ...

  2. 【Linux 内核 内存管理】memblock 分配器编程接口 ⑤ ( memblock_free 函数 | memblock_remove_range 函数 )

    文章目录 一.memblock_free 函数分析 二.memblock_remove_range 函数分析 memblock 分配器提供了如下编程接口 : ① 添加内存 : memblock_add ...

  3. Linux内核内存管理(1):内存块 - memblock

    Linux内核内存管理 内存块 - memblock rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. 简介 内存管理是操作系统内核中最复杂的部分之 ...

  4. 【Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )

    文章目录 一.free_area 空闲区域结构体源码分析 二.分配标志位 三.GFP_ZONE_TABLE 标志位区域类型映射表 四.分配标志位对应的内存区域类型 一.free_area 空闲区域结构 ...

  5. linux 内核内存管理

    物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...

  6. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

  7. 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

    文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...

  8. Linux内核内存管理(3):kmemcheck介绍

    Linux内核内存管理 kmemcheck介绍 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 5.10.13不存在kmemcheck的概念,取代的是k ...

  9. Linux内核内存管理(2):固定映射地址(fixmap)和输入输出重映射(ioremap)

    Linux内核内存管理 固定映射地址(fixmap)和输入输出重映射(ioremap) rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. Print ke ...

最新文章

  1. JavaScript正则表达式快速判断技巧
  2. Linux 文件的权限
  3. 详解在group by分组查询中where 和 having的用法和区别。
  4. 进程返回linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
  5. SAP Spartacus TypeScript和编译后的JavaScript命名规范
  6. 前端进阶之路: 前端架构设计(2)-流程核心
  7. div覆盖div DIV相互重叠如何解决
  8. 基于 Android NDK 的学习之旅-----环境搭建
  9. r720换固态硬盘后如何重装系统_联想R720重装Winddows10无法识别固态硬盘咋办
  10. layui的表格可以动态添加行吗_Layui数据表格动态添加行的处理方式(原生HTML方式)...
  11. SAP 金额转换成大写
  12. 外包,你是外包,麻烦你不要偷吃公司零食,注意素质...
  13. T83723 数人wjh --题解
  14. 不良事件总结怎么写_2017年第一季度不良事件总结分析
  15. 鼠标悬停放大图片特效
  16. 基于java的高速公路收费系统——计算机毕业设计
  17. 计算机应用与维修电竞与管理,电子竞技运动与管理-五年制高技招生专业-广州市白云工商技师学院_广州市白云工商高级技工学校_信息工程系(计算机系)...
  18. 为什么《百家讲坛》上的中学教师收视率最高?
  19. Jump Server
  20. 递归函数将一个正整数的各位由高到低依次输出

热门文章

  1. 暴雪的hash算法[翻译]
  2. 谷歌这是玩的哪一手?谷歌确实慌了,也确实怕了
  3. 韵律和我……歌颂音乐的音乐《最好的声音》
  4. 微信小游戏用tensorflow.js人体姿势PoseNet控制
  5. 登录框和操作步骤插件(大神出品)
  6. 为什么香港计算机科学家多,[转载]为什么香港中文大学汤晓鸥教授团队的人脸识别技术能够击败人类?...
  7. PTA | 实验三 输出m到n之间的全部素数
  8. Mysql出现中文乱码Incorrect string value: '\xC9\xCF\xBA\xA3\xCA\xD0'解决办法
  9. HRC30交易结构上诞生的私域流量新玩法
  10. 浅析不良资产商业性债转股法律相关问题