system contig heap与system heap

  • 从代码中我们看到system contig heap与system heap同属一个文件中,ion_system_heap.c
  • 相同点:它们都是根据用户传递的字节len,转换成order,从buddy中申请内存页
  • 不同点
  1. contig heap申请的是连续内存页,最大能到order 10(受限于buddy)。而system heap就只能通过order 8/4/0三种拼凑出来,凑够用户需要的内存
  2. contig heap没有自己的内存pool,释放时直接返还给buddy。system heap有自己的pool(分为order 8/4/0)。

system contig heap创建

//指定heap name,heap type和ops
static struct ion_heap *__ion_system_contig_heap_create(void)
{
struct ion_heap *heap; heap = kzalloc(sizeof(*heap), GFP_KERNEL);
if (!heap)
return ERR_PTR(-ENOMEM);
heap->ops = &kmalloc_ops;
heap->type = ION_HEAP_TYPE_SYSTEM_CONTIG;
heap->name = "ion_system_contig_heap";
return heap;
} static int ion_system_contig_heap_create(void)
{
struct ion_heap *heap; heap = __ion_system_contig_heap_create();
if (IS_ERR(heap))
return PTR_ERR(heap);
//添加到ion dev,并且在/d/ion/heaps目录下创建debug节点,节点名以heap name命名:"ion_system_contig_heap"
ion_device_add_heap(heap);
return 0;
}
//开机过程中,驱动加载时创建,当然这只是参考代码,具体还要看不同平台的具体实现
device_initcall(ion_system_contig_heap_create);

system contig heap内存分配

static struct ion_heap_ops kmalloc_ops = {
.allocate = ion_system_contig_heap_allocate,
.free = ion_system_contig_heap_free,
.map_kernel = ion_heap_map_kernel,
.unmap_kernel = ion_heap_unmap_kernel,
.map_user = ion_heap_map_user,
};
  • ion_system_contig_heap_allocate()函数分配:

直接从buddy中分配连续的内存块

static int ion_system_contig_heap_allocate(struct ion_heap *heap,
struct ion_buffer *buffer,
unsigned long len,
unsigned long flags)
{
int order = get_order(len);
struct page *page;
struct sg_table *table;
unsigned long i;
int ret;
//直接从buddy中分配内存页
//分配的内存页是可能比实际请求的大的,比如申请len是3个page大小,那么order就为2,实际申请了4个page
page = alloc_pages(low_order_gfp_flags, order);
if (!page)
return -ENOMEM;
//将申请到的连续内存页分割成一页页
split_page(page, order); //由于在分配时可能多分配,因此需要将多余的page释放回去。比如申请3个page,实际分配了4个
len = PAGE_ALIGN(len);
for (i = len >> PAGE_SHIFT; i < (1 << order); i++)
__free_page(page + i);
//接着申请sg_table
table = kmalloc(sizeof(*table), GFP_KERNEL);
if (!table) {
ret = -ENOMEM;
goto free_pages;
}
//由于是连续的内存,因此只需要申请一个scatterlist
ret = sg_alloc_table(table, 1, GFP_KERNEL);
if (ret)
goto free_table;
//将连续内存首页地址存到sg_table中
sg_set_page(table->sgl, page, len, 0); buffer->sg_table = table; return 0; free_table:
kfree(table);
free_pages:
for (i = 0; i < len >> PAGE_SHIFT; i++)
__free_page(page + i); return ret;
}

system contig heap内存释放

  • ion_system_contig_heap_free()函数:

将内存全部返还给buddy

static void ion_system_contig_heap_free(struct ion_buffer *buffer)
{
struct sg_table *table = buffer->sg_table;
struct page *page = sg_page(table->sgl);
unsigned long pages = PAGE_ALIGN(buffer->size) >> PAGE_SHIFT;
unsigned long i;
//释放时就直接将内存页归还给buddy
for (i = 0; i < pages; i++)
__free_page(page + i);
sg_free_table(table);
kfree(table);
}

【内存管理】ION内存管理器浅析(system contig heap)的更多相关文章

  1. Java内存管理-掌握虚拟机类加载器(五)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍虚拟机类加载机制,讲解了类加载机制中的三个阶段,分别是:加载.连接(验证.准 ...

  2. 垃圾回收GC:.Net自己主动内存管理 上(三)终结器

    垃圾回收GC:.Net自己主动内存管理 上(三)终结器 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主 ...

  3. android内存管理-ION/PMEM【转】

    转自:https://www.jianshu.com/p/0eac3d3ff6bb ION debug ION 在/sys/kernel/debug/ion/ 提供一个debugfs 接口. 每个he ...

  4. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  5. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.3.垃圾收集器与内存分配策略

    1.学习目的 当需要排查各种内存溢出. 内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节. Java内存运行时区域的各个部分,其中程序计数 ...

  6. Windows 7 里进程管理器里面的各列是什么含义?主要是和内存有关的内存-专用工作集,内存-工作集,内存-提交大小???

    内存 - 工作集:私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和. 内存 - 峰值工作集:进程所使用的工作集内存的最大数量. 内存 - 工作集增量:进程所使用的工作集内存中的 ...

  7. Oracle DB 自动管理共享内存

    • 启用Oracle Enterprise Manager (EM) 内存参数 • 设置自动优化的内存参数 • 使用手动优化的SGA 参数覆盖最小大小 • 使用SGA Advisor 设置SGA_TA ...

  8. (转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

    http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟 ...

  9. Java的内存管理与内存泄露

    作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存 ...

  10. kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)

    1 前景回顾 1.1 内核映射区 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途. 重要的是强调以下事实 : 内核提供 ...

随机推荐

  1. 计数 dp 部分例题(一~五部分)

    一.状态设计和简化(状態をまとめる) 例题1:Unhappy Hacking 题意 有一个空串,可以进行下面三种操作: 在末尾加入一个 \(0\). 在末尾加入一个 \(1\). 删去末尾的数,如果串 ...

  2. go-bindata安装问题

    问题描述使用命令 go get -u github.com/jteeuwen/go-bindata/... 报错: go get -u github.com/go-bindata/go-bindata ...

  3. FTP为什么越来越不好用了?要如何替代?

    FTP相信很多人都不陌生,作为世界范围内第一个文件传输协议,FTP解决了互联网文件传输需求,至今已被广泛使用30多年.但很多人现在慢慢发现,FTP越来越不好用了,或者说越来越无法满足自己需求了,这是为 ...

  4. PHP基础教程(二)

    本部分列出了在 PHP 中使用的各种运算符:算数运算符 运算符 说明 例子 结果 + Addition x=2x+2 4 - Subtraction x=25-x 3 * Multiplication ...

  5. vue3 生成二维码 qrcodejs2-fix

    1.安装qrcodejs2-fix npm install qrcodejs2-fix 2.引入qrcodejs2-fix import QRCode from 'qrcodejs2-fix'; 3. ...

  6. k8s master高可用

    每台master都要部署haproxy,keepalived keepalived 配置文件:! Configuration File for keepalivedglobal_defs { rout ...

  7. window.onerror的总结

    // a.js window.onerror = function (message, url, line, column, error) { console.log('log---onerror:: ...

  8. 错题笔记:只有浮点型float double可以装小数

    char是不能表示小数的,如果赋值小数 则小数部分直接省略.

  9. python写入sqlserver中文乱码问题

    需求是python3开发,数据库是sqlserver,第一次用python操作sqlserver,写入数据时,中文全部变成了?? 试了pyodbc,但缺少sqlserver驱动 试了sqlStr.en ...

  10. Java-【Arrays类】和【System类】

    Arrays类 [基本介绍] JDK中提供了一个专门用于操作数组的工具类,即Arrays类,位于java util 中. 用前需导包:import java.util.Arrays; [常用方法] 返 ...