linux drm 内存管理,linux DRM GEM 笔记

在GPU上的各种操做中涉及到多种、多个buffer的使用。

一般咱们GPU是经过图像API来调用的,例如OPENGL、vulkan等,因此GPU上buffer的使用,实际上就是在这些图像API中被使用。

例如在opengl es中,vertex/fragment shader、vertex index、vertex buffer object、uniform buffer object、texture、framebuffer等都须要一块memory buffer来存储对应的内容。

而在vulkan中有提供明确的memory管理规则,它把memory分红两半来管理分别是:resource和backing memory。

resource有两种类型buffer和image。

Backing memory也被叫作device memory。

不一样类型的resource对Backing memory的需求不同,vulkan根据resource的属性来分配对应的backing memory。

因此memory的管理在整个GPU的操做中起着重要做用。

Memory buffer究其本质就是ram上的段内存空间可被表示为:address + size。

若是支持MMU,虚拟地址连续,但物理地址不连续的一段内存。

由于linux系统的特色,应用层不能直接访问物理地址等缘由,因此须要linux kernel中提供一种方法来让用户层图像API访问device buffer。

GEM(Graphics Execution Manager)便是linux DRM中用于完成memory管理的内核基础设施(不止这一种)。

GEM做为一种内存管理方式,并未覆盖各类在userspace和kernel使用状况(use cases)。

GEM提供了一组标准的内存相关的操做给userspace,以及一组辅助函数给kernel drivers,kernel drivers还须要实现一些硬件相关的私有操做函数。

GEM所管理的memory具体类型、属性是不可知的,咱们并不知道它所管理的buffer对象包含了什么。若是要获知GEM所管理的buffer对象的具体内容和使用目的,须要kernel drivers本身实现一组私有的ioctl来获取对应的信息。

一个实际的GEM对象所管理的memory类型与硬件平台密切相关,这里咱们主要讨论嵌入式平台上的GPU的MEMORY管理。

嵌入式平台上GPU和CPU每每共享主存DDR,因此在本文中讨论GEM的backing memory每每就是DDR上的某段物理内存页(连续或非连续都可)。

这段物理内存会被CPU(份内核虚拟地址和用户层虚拟地址)、GPU(虚拟地址和物理地址)访问。

在CPU端访问时,当在用户层访问时,须要经过GEM的mmap()规则映射成用户层虚拟地址,在kernel中使用时须要映射成内核虚拟地址。

在GPU端访问时,若是GPU支持MMU,GPU也使用MMU映射后虚拟地址,若是不支持MMU,GPU直接访问物理地址。

userspace:

在userspace当须要建立一个新的GEM对象时,会经过调用driver私有的ioctl接口来获取。

虽然不一样driver设计的icotl接口不同,可是最终都经过返回一个handle给用户层&#

你可能感兴趣的:(linux,drm,内存管理)