【转】DRM(三)libdrm库

Python023

【转】DRM(三)libdrm库,第1张

DRM是Linux内核层的显示驱动框架。它把显示功能封装成 open/close/ioctl 等标准接口,用户空间的程序调用这些接口,驱动设备,显示数据。

libdrm库封装了DRM driver提供的这些接口。通过libdrm库,程序可以间接调用DRM Driver。

DRM驱动会在/dev/dri下创建3个设备节点:

使用drmOpen()打开设备。它根据指定的name和busid,在上述三个设备中选择匹配的节点。

也可以使用open(),直接打开指定设备。

得到、设置capability。

下图显示各个组件,以及组件之间的关联关系。在DRM的函数名中称作资源(Resource)。如drmModeGetResources()。

每种资源的结构都定义了一个成员,唯一标识这个资源。如drmModeCrtc的crtc_id、drmModeConnector的connector_id、drmModeEncoder的encoder_id、drmModePlane的plane_id。

显示设备的设置、状态,保存在若干结构、变量中,如下图。如drmModeModeInfo,保存设备大小,刷新率。drmModeConnection保存连接状态。

drmModeRes结构保存DRM设备的资源集。

drmModeRes的成员fbs、crtcs、connectors、encoders是变长数组,数组长度保存在对应的变量,如count_fbs中。数组中保存的是资源ID。

函数drmModeGetResources()用于得到资源集。

根据资源 ID 得到对应的资源,包括connector、encoder、crtc。

与其他资源不同,plane资源不在drmModeRes结构中,而是保存在drmModePlaneRes结构。

成员planes是变长数组,数组长度保存在count_planes中。这里保存是plane的资源ID。

drmModeGetPlaneResources()得到plane资源集。

drmModeGetPlane() 根据Plane ID得到Plane。

drmModeProperty结构保存属性。

drmModeObjectProperties保存资源的属性集。

drmModeObjectGetProperties()得到资源属性集。

drmModeGetProperty()得到属性,drmModeObjectSetProperty()设置属性。

使用drmIoctl()创建、映射framebuffer。

使用Linux API函数 mmap(),将framebuffer映射到用户空间。

加入framebuffer(不是提交显示!)。

drmModeAtomicReq保存DRM请求。

drmModeAtomicCommit()提交请求。比如,将framebuffer保存的图像提交显示。

将framebuffer绑定到plane。程序更新framebuffer,就是更新plane。

Linux DRM API - NVIDIA

DRM示例工程 zizimumu/DRM_test

DRM,英文全称Digital Rights Management ,一般翻译为数字版权保护或数字版权管理。DRM分为两类一类是多媒体保护,例如加密电影、音乐、音视频、流媒体文件。另外一类是加密文档,例如Word, Excel, PDF等。DRM主要通过技术手段来保护文档、电影、音乐不被盗版。这项技术通过对数字内容进行加密和附加使用规则对数字内容进行保护,其中,使用规则可以断定用户是否符合播放。

系统原理:

系统会将密钥标识和许可证颁发机构地址写入打包加密后的内容的头部,并且使用另一对密钥,通过椭圆曲线加密算法对头部信息进行签名,防止头部信息被非法修改。内容部分的加密过程可以简单描述为,首先使用SHA-1散列算法处理56位密钥,得到一个160位,即20字节的密钥散列。这个密钥散列的前12字节将用作生成加密过程中使用的密钥。这12个字节将作为一个密钥,通过RC4算法加密一个全零的64字节串,得到一个64字节的加密结果,其中前48字节,即12个32位字作为产生加密内容使用的密钥的来源,分别针对前面6个32位字的和后面6个32位字进行操作。对于被加密的内容来说,首先把被加密的内容切分为8个字节的数据块。对于每一个8个字节的数据块,它的前32位数据将和上述密钥的前面6个32位字的进行运算,后32位数据将和上述密钥的后面6个字节进行运算。具体运算过程是,32位数据与6个32位字的的密钥的第一节字节相乘,然后除以4294967296取其余数,并交换结果的高16位和低16位,然后再与6个32位字的的密钥的第二节字节相乘,然后除以4294967296取其余数,并交换结果的高16位和低16位,然后再与6个32位字的的密钥的第三节字节相乘,然后除以4294967296取其余数,并交换结果的高16位和低16位,然后再与6个字节的密钥的第四节字节相乘,然后除以4294967296取其余数,并交换结果的高16位和低16位,然后再与6个32位字的的密钥的第一节字节相乘,然后除以4294967296取其余数,并交换结果的高16位和低16位,然后再加上6个32位字的密钥,然后除以4294967296取其余数,上述过程定义为函数f(x),设一个64位状态值,并设初值为零。

比较大的文档DRM相关中文提供商有:

Adobe 中国:http://www.chinese-s.adobe.com/

前沿科技:http://www.drm.net.cn/

比较大的多媒体DRM(加密保护电影、音乐、视频文件)相关中文提供商有:

海海软件:http://www.haihaisoft.com

金通集团:http://www.gthome.com

DRM,英文全称Digital Rights Management, 可以翻译为:数字版权管理。 由于数字化信息的特点决定了必须有另一种独特的技术,来加强保护这些数字化的音视频节目内容的版权,该技术就是数字权限管理技术---DRM(digital right management)。

DRM的位置:

1、因为Linux内核内部接口和数据结构随时可能改变,因此DRI内核模块对于特殊内核版本必须特别编译。DRI【Direct Rendering Infrastructure 可翻译为:直接着色基础结构(基层直接渲染);DRI是一个安全且有效率的直接对显示硬件存取的方法。它包含对X server,一些client函数库、以及对内核的变更;DRI的一个主要目的就是提供高效能的OpenGL支持】内核模块防止目录为/lib/modules/.../kernel/drivers/gpu/drm,一般情况下,不管DRI模是否需要,X服务都自动加载.[1]

2、DRI:Direct Rendering Infrastructure 可翻译为:直接着色基础结构(基层直接渲染);DRI是一个安全且有效率的直接对显示硬件存取的方法。它包含对X server,一些client函数库、以及对内核的变更;DRI的一个主要目的就是提供高效能的OpenGL支持。

DRM以如下三种主要方式支持DRI

(1)DRM提供图形硬件的同步访问

(2)DRM强制使用DRI安全规则访问图形硬件

(3)DRM提供通用的DMA引擎