前言;如果我们打开过Diirectfb的调试选项,我们会发现很大一部分的信息都和DFB的缓存buffer的信息:dfb_surface_pool_lock()有关,例如:

(!) [Main Thread       4.120] (  430) *** Assumption [(lock)->offset == (lock)->allocation->offset || (lock)->offset == ~0] failed *** [surface_pool.c:855 in dfb_surface_pool_lock()]

本节转载Smith先生写的一篇博客,对DFB的平面池 surface pool 和 linux 内核frame buffer 的接口配置定义和surface pool本身的命中机制进行了深入的介绍。

文章有部分是自己的心得,用【】标示。原文地址:http://blog.csdn.net/acs713/article/details/7879545

1.1版本之前,DFB只有基本的系统内存概念

即使用局部或共享内存;或者视频内存概念,即固定的物理地址和一定大小的连续的内存块,该内存直接由CPU映射或者由DFB内置的内存管理器Surface Manager管理。Surface Manager是一个一维的内存管理器,它会踢出(kick-out)过时的(即不再需要的)内存。这些内存一般是本地备份的内存。只有很少的情况,系统或驱动模块可以控制或自己实现内存分配。通过调用显示层(Display Driver)驱动API: AllocateSurface(), ReallocateSurface()和DeallocateSurface().这些内存分配和释放通常不是由驱动实现的,因此通常使用video内存中的标准分配。【早期是标准的内存共享机制+ 视频驱动API】

1.1版本以后,DFB引入了平面池surface pool的概念

因此程序员可以以自己的方式管理平面缓存(surface buffer)。Surface Pool最大的优势是将hardcoded【 Programmers may not have a dynamic user interface solution for the end user worked out but must still deliver the feature or release the program】的system<->video堆(heap)逻辑(包括sync,transfer,locking等),转移到通用的机制。你可以创建任意多的heaps/pools。

Surface Pool Negotiation【理解为buffer命中】是关键的一步,因为它把surface buffer内存分配请求路由到正确的pool.如果有多个pool满足条件,则从中选择一个最合适的。这些条件包括:支持必要的访问flag(access flags,如 CPU/GPU),surface类型标记(如Layer font)和其他必要的标准。

当一个CoreSurface基于选定的CoreSurfaceConfiguration配置创建好以后,CoreSurfaceBuffer结构就分配和添加好了,然而其实并没有任何像素数据的分配发生。第一个lock或write操作会触发negotiation操作。

例如,当用户需要进行画图操作时,

会在获取显卡状态时,首先对buffer进行lock.即调用dfb_surface_buffer_lock【注意这个在调试信息里面经常出来的函数】。该函数检查有没有合适内存分配对象allocation存在,如果没有则调用dfb_surface_pools_allocate( buffer, accessor, access, &allocation );去创建一个allocation对象。

dfb_surface_pools_allocate会做些什么操作呢?关键的一步,是去作平面池协商Surface Pool Negotiation,调用: dfb_surface_pools_negotiate( buffer, accessor, access, pools, pool_count, &num_pools )。

这个协商主要作什么呢?前面讲过,它把surface buffer内存分配请求路由到正确的pool。何为正确的pool?当然是那些能满足内存分配需求的pool.所以,我们会看到,在这个协商函数里,它会遍历各个pool, 来找到那个满足我们需求的pool.它会调用system module(如fbdev)的Testconfig.Testconfig会计算出我们需要分配的buffer大小并使用framebuffer驱动的ioctrl,查询我们是否能完成满足内存分配的能力。

当pool找到了,下一步就是调用dfb_surface_pool_allocate( pool, buffer, &allocation )为这些pool创建allocation对象。这个allocation对象到底是什么个东东呢?请参考下图。

我们假设system module采用fbdev。那么,在上面这个allocate函数里,会出现 funcs->AllocateBuffer( pool, pool->data, get_local(pool), buffer, allocation, allocation->data )【这应该是一个注册函数的调用】这样的代码,最终将调用fbdevAllocateBuffer分配内存。allocation的buffer、surface、pool、access、size和offset成员将得到赋值。其中size和offset是通过fbdev的AllocateBuffer 并通过ioctrl获取而赋值的。接着我们调用dfb_surface_allocation_update对buffer的allocation进行更新,主要是written和read成员。

在allocation创建和更新后,我们会对该allocation进行锁定,它的实现由dfb_surface_pool_lock( allocation->pool, allocation, lock )来完成。参数lock是CoreSurfaceBufferLock类型,是读、写锁的抽象,这个锁是显卡状态的一个成员变量。

可见,先将lock的allocation成员与我们分配的allocation对象关联起来。然后,调用fbdevLock函数,完成其他成员的赋值。如下图:

上面的alloc是在fbdevAllocateBuffer通过ioctrl从底层获取的。它通过allocation的成员变量data进行传递。

【小结:Directfb 向下的调用接口】

1 funcs->AllocateBuffer( pool, pool->data, get_local(pool), buffer, allocation, allocation->data )

其中函数funcs->AllocateBuffer在使用fbdev设备时候,初始化应该会先注册fbdev的接口函数fbdevAllocateBuffer

2 Surface Pool存储的是frame buffer的块的查询和访问信息而不是数据。

【编撰】Directfb 深入 002 DirectFB内存分配与管理:surface pool相关推荐

  1. java内存分配与管理

    栈.堆.常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,详细讲解Java内存分配方面的知识 Java内存分配与管理是Java的核心技术之一,深入Java ...

  2. Spark Tungsten揭秘 Day3 内存分配和管理内幕

    Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...

  3. C++内存分配和管理

    1. malloc.calloc.realloc.alloca的区别 malloc:申请指定字节数的内存.申请到的内存中的初始值不确定. calloc:为指定长度的对象,分配能容纳其指定个数的内存.申 ...

  4. 程序的内存分配和管理

    RAM:运行内存,不能掉电存储.ROM:存储性内存,可以掉电存储,例如内存卡.Flash. 由于RAM类型不具备掉电存储能力(即一掉电数据消失),所以app程序一般存放于ROM中.RAM的访问速度要远 ...

  5. 操作系统——内存分配与管理

    内存的定义: 内存是用于存放数据的硬件.程序在执行前需要先放到内存中才能被CPU处理. 按字编址: 如果字长为16位的计算机"按字编址",则每个存储单元大小为1个字;每个字的大小为 ...

  6. 计算机内存分配、管理

    当我们写完一个程序后,编译.链接.执行,表面看似很简单,其实程序执行过程中,内存为我们的程序做了很多事. 我们先来看一个图 一般我们将内存分为:堆区.栈区.全局区.代码区.常量区,各个区域存放的内容: ...

  7. 【11g体系结构,4】AMM(内存分配自动管理)

    一.AMM (automaitc memory managerment) 1.oracle 10g SGA的自动管理 : SGA_TARGET 指定了SGA可以使用的最大内存大小,而SGA中各个内存的 ...

  8. 内存分配管理 自定义

    在内存管理中,经常需要自定义内存分配释放,也就是需要定义new 和 delete. 通常为了有针对性的对某些对象的内存分配进行管理,定义一个内存管理基类 1.定义 1 struct Memory 2 ...

  9. 内存分配策略(一):JVM栈桢及方法调用详解

    JVM 线程堆栈分析过程详解 在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中 ...

最新文章

  1. Web登录很简单?开玩笑!
  2. pip19离线_更新pip为20后不显示下载链接无法离线下载回退pip版本
  3. Jquery-基础知识点
  4. java 根据客户端重定向_JavaWeb【1.4HttpServletResponse类、重定向】
  5. 工作404-判断浏览器函数
  6. php 数组按个数分组,如何在PHP中基于内部数组键对数组进行分组?
  7. 11个编程接单的网站,你有技术就有收入,有收入就有女朋友《男盆友》
  8. 【单片机学习笔记】(25):PID初识、门电路符号、H桥驱动电路、中断服务函数使用注意事项、SIM800C打电话发短信、OLED
  9. springboot+quartz定时任务
  10. Callnovo客诺人采访Hilario Linsao :优质平台成就优秀人才
  11. GoLand Jetbrain工具使用
  12. 打开html文件是文字模式,为什么我打开的有些网页成了全文字格式的?
  13. JS正则表达式手机号中间4位替换成*星号
  14. Excel批量更改图片名称(无需下载其他工具)
  15. 深圳市专精特新企业申报条件及各区奖励政策重点介绍,补贴20-200万
  16. css超出两行显示省略号
  17. 博弈——ICE公平组合游戏(简单整理结论)
  18. mysql如何创建组合索引
  19. 深入理解函数式编程(下)
  20. 在 sys.servers 中找不到服务器 ‘xxxxxx‘。请验证指定的服务器名称是否正确。

热门文章

  1. WPF 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
  2. C#LeetCode刷题-随机数
  3. C#LeetCode刷题之#242-有效的字母异位词(Valid Anagram)
  4. hdf5 matlab,通过MATLAB将矩阵数据写入HDF5文件中的每个数据类型成员
  5. ipython和anaconda区别_anaconda和python区别
  6. sdk和api有什么区别
  7. Python turtle库的画笔控制说明
  8. Python——单元测试
  9. HTML/CSS进阶
  10. 同步的概念(python 版)