【Linux 内核 内存管理】memblock 分配器编程接口 ④ ( memblock_alloc 函数 | memblock_alloc_base 函数 )
文章目录
- 一、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 函数 )相关推荐
- 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )
文章目录 一.do_mmap 函数执行流程 二.do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 & ...
- 【Linux 内核 内存管理】memblock 分配器编程接口 ⑤ ( memblock_free 函数 | memblock_remove_range 函数 )
文章目录 一.memblock_free 函数分析 二.memblock_remove_range 函数分析 memblock 分配器提供了如下编程接口 : ① 添加内存 : memblock_add ...
- Linux内核内存管理(1):内存块 - memblock
Linux内核内存管理 内存块 - memblock rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. 简介 内存管理是操作系统内核中最复杂的部分之 ...
- 【Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )
文章目录 一.free_area 空闲区域结构体源码分析 二.分配标志位 三.GFP_ZONE_TABLE 标志位区域类型映射表 四.分配标志位对应的内存区域类型 一.free_area 空闲区域结构 ...
- linux 内核内存管理
物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...
- 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)
文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...
- 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )
文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...
- Linux内核内存管理(3):kmemcheck介绍
Linux内核内存管理 kmemcheck介绍 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 5.10.13不存在kmemcheck的概念,取代的是k ...
- Linux内核内存管理(2):固定映射地址(fixmap)和输入输出重映射(ioremap)
Linux内核内存管理 固定映射地址(fixmap)和输入输出重映射(ioremap) rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. Print ke ...
最新文章
- JavaScript正则表达式快速判断技巧
- Linux 文件的权限
- 详解在group by分组查询中where 和 having的用法和区别。
- 进程返回linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- SAP Spartacus TypeScript和编译后的JavaScript命名规范
- 前端进阶之路: 前端架构设计(2)-流程核心
- div覆盖div DIV相互重叠如何解决
- 基于 Android NDK 的学习之旅-----环境搭建
- r720换固态硬盘后如何重装系统_联想R720重装Winddows10无法识别固态硬盘咋办
- layui的表格可以动态添加行吗_Layui数据表格动态添加行的处理方式(原生HTML方式)...
- SAP 金额转换成大写
- 外包,你是外包,麻烦你不要偷吃公司零食,注意素质...
- T83723 数人wjh --题解
- 不良事件总结怎么写_2017年第一季度不良事件总结分析
- 鼠标悬停放大图片特效
- 基于java的高速公路收费系统——计算机毕业设计
- 计算机应用与维修电竞与管理,电子竞技运动与管理-五年制高技招生专业-广州市白云工商技师学院_广州市白云工商高级技工学校_信息工程系(计算机系)...
- 为什么《百家讲坛》上的中学教师收视率最高?
- Jump Server
- 递归函数将一个正整数的各位由高到低依次输出
热门文章
- 暴雪的hash算法[翻译]
- 谷歌这是玩的哪一手?谷歌确实慌了,也确实怕了
- 韵律和我……歌颂音乐的音乐《最好的声音》
- 微信小游戏用tensorflow.js人体姿势PoseNet控制
- 登录框和操作步骤插件(大神出品)
- 为什么香港计算机科学家多,[转载]为什么香港中文大学汤晓鸥教授团队的人脸识别技术能够击败人类?...
- PTA | 实验三 输出m到n之间的全部素数
- Mysql出现中文乱码Incorrect string value: '\xC9\xCF\xBA\xA3\xCA\xD0'解决办法
- HRC30交易结构上诞生的私域流量新玩法
- 浅析不良资产商业性债转股法律相关问题