如果在搜索引擎離搜索 DRM 映入眼簾的盡是Digital Rights Managemen,也就是數字版權加密保護技術。
這當然不是我們想要的解釋。在類unix世界中還有一個DRM即The Direct Rendering Manager,它是DRI(Direct Rendering Infrastructure)框架的一個組件。而DRI的作用是為類Unix系統提供高效視頻加速(很重要的用途是可以對3D渲染提供加速效果)。
DRI是由以下2個部分組成的(這2個在linux即可以編譯進內核,也可以以模塊形式存在):
1、通用的DRM驅動。
2、支持特定顯卡的驅動。
DRM - Direct Rendering Manager
DRM是一個內核級的設備驅動,既可以編譯到內核中也可以作為標准模塊進行加載。DRM最初是在FreeBSD中出現的,後來被移植到Linux系統中,並成為Linux系統的標准部分。DRM可以直接訪問DRM clients的硬件。DRM驅動用來處理DMA,內存管理,資源鎖以及安全硬件訪問。為了同時支持多個3D應用,3D圖形卡硬件必須作為一個共享資源,因此需要鎖來提供互斥訪問。DMA傳輸和AGP接口用來發送圖形操作的buffers到顯卡硬件,因此要防止客戶端越權訪問顯卡硬件。
Linux DRM層用來支持那些復雜的顯卡設備,這些顯卡設備通常都包含可編程的流水線,非常適合3D圖像加速。內核中的DRM層,使得這些顯卡驅動在進行內存管理,中斷處理和DMA操作中變得更容易,並且可以為上層應用提供統一的接口。
DRM代碼位置
因為Linux kernel內部接口和數據結構可能隨時發生變化,所以DRI模塊要針對特定的內核版本進行編譯。kernel 2.6.26之後的版本,DRM(DRI kernel模塊)源碼存放在kernel/drivers/gpu/drm中;在這之前的版本,源碼在kernel/drivers/char/drm目錄中。每一個3D硬件加速驅動都包含一個內核模塊,並且都需要使用DRM支持代碼。
DRI - Direct Rendering Infrastructure
DRI並不是一個軟件模塊。相反DRI是由一系列的軟件模塊組成。引入DRI的目的是為了3D圖形加速,DRI是一個軟件架構,用來協調linux kernel,X windows系統,3D圖形硬件以及OpenGL渲染引擎之間的工作。
DRM支持DRI的方式
DRM以三種方式支持DRIDRM提供到顯卡硬件的同步訪問。Direct rendering system有多個實體(比如X server,多個direct-rendering客戶端,以及kernel)競爭訪問顯卡硬件。PC類的顯卡在多個實體訪問顯卡硬件時會使用鎖。DRM為每個顯卡設備提供了一個鎖,來同步硬件的訪問。比如X server正在執行2D渲染,此direct-rendering客戶端執行一個軟件回調,這個軟件回調會讀寫frame buffer。對於一些高端卡來說,由於硬件內部本身會對訪問命令做排序,因此並不需要使用這個鎖。
DRM在訪問顯卡硬件時,強制執行DRI安全測策略。X server以root權限運行,在訪問顯卡的framebuffer和MMIO區域時,會用/dev/mem映射這些區域。direct-rendering 客戶端,並不是運行在root權限的,但是仍然需要類似的映射。DRM設備接口允許客戶端創建這些映射,但是必須遵守以下限制: *僅當客戶端連接到X server時才能映射這些區域,這就迫使direct-rendering客戶端遵守正常的X server安全策略。 * 僅當客戶端能夠打開/dev/drm?時才可以映射這些區域。這允許系統管理員可以配置direct rendering訪問,僅可信的用戶才能訪問。 * 客戶端只能映射X server允許映射的區域。
DRM提供了一個通用的DMA引擎。大部分現代PC類計算機的顯卡硬件提供command FIFO的DMA訪問。DMA 訪問比MMIO訪問有更好的吞吐量性能。對於這些顯卡,DRM 提供的DMA引擎包含下面的features: *
DRM和DRI關系
早期的Direct Rendering Infrastructure
當前的Direct Rendering Infrastructure
我們可以看出DRM是DRI的一個組成部分,DRI同時還包含kms以及OPenGLES DRI driver部分。