Linux GUI子系統概述 GUI子系統的構成及工作流程

2020-12-08 電子發燒友

Linux GUI子系統概述 GUI子系統的構成及工作流程

Nick 發表於 2020-12-05 10:45:54

作者:Nick

開始前的幾點說明:

本文會儘量從初學者的角度去描述整個Linux整個圖形子系統,但由於其複雜性,涉及到的模塊比較多,可能會需要一些相關的先驗知識;

對於系統的介紹,分析的著重點可能不會在於為什麼該這樣設計,而是在於在現有的顯示系統下,我們能做些什麼來適配我們的目的;

1.前言

GUI作為人機互動信息量最大的一種方式,無論在消費還是工業級產品上都大行其道。但同時由於它處在整個系統的核心位置,對外需要通過滑鼠、鍵盤 、顯示器進行I/O獲取和控制,在內需要負責圖形的生成,渲染,整個系統複雜度比較高。本文會從以下幾個 方面來介紹GUI子系統:

以Linux下的原生GUI子系統為例,概述GUI子系統的概念,軟硬體部分在GUI子系統的中的角色及大致構成;

著重分析Linux下DRM+KMS的軟體實現方式,並且以Xilinx的Zynq-7000 SOPC為例,詳細介紹相關片內硬體模塊在GUI系統中的角色及實現方式;(由於GPU模塊硬體的源碼的開源程度不高,不在本文的分析範圍內)

分析現有GUI框架下,在硬體加速方面,我們能做的事情,並以非常簡單的圖像處理為例,給出相應的設計方案;

本文的最後一部分,會在Zynq-7000上面(digilent的Zybo開發板)部署整個Linux+硬體邊緣提取處理+Qt+HDMI的環境,並給出具體的實現流程;

2.Linux GUI子系統概述

GUI作為人機互動的一種方式,通過其承載的大量信息提高了信息交流的效率。這裡我們不介紹滑鼠、鍵盤等輸入設備,只介紹輸出顯示這一子模塊。生活中大家最常見的圖形化界面估計就是圖像化界面的桌面環境,即窗口系統,(如下圖的Ubuntu、Xfce等)。

窗口系統一般都具備以下基本功能:

通過WIMO(Window-視窗、Icon-圖標、Menu-選單、Pointer-指標)4個基本元素來實現人機互動;

上述的4個基本元素都能通過第三方的程序來擴展(也就是安裝新程序);

在實現方式上,大部分Linux下的窗口系統都是通過X來響應不同的交互請求及輸出到顯示器上。因此,整個應用層的GUI結構如下:

因此,在應用層面上,GUI系統的核心部分是X,X的總體功能一句話描述如下:通過指定的協議接受本地或遠程的滑鼠、鍵盤需求,並切輸出相應的窗口畫面到顯示設備上。細分來講,X主要由以下4個組件構成:

X server:負責軟硬體的管理,將輸入的軟硬體事件通過一定協議轉發給X client,將輸出的圖形繪製在屏幕上;

X client:每個需要涉及到GUI的App,可以實例化為一個X client,X client主要是響應X server分發下來的事件,通過處理後,將待繪製的圖像回傳給X Server;

X window manager:X window manager作為一個特殊的X client,主要負責為X server管理多個X client(一個具體的例子就是對虛擬桌面的管理),起著視窗管理員的角色。常見的X window manager如下:

. GNOME (GNU Network Object Model Environment);
. KDE (K Desktop Enviroment)
. twm (Tab Window Manager)
. XFCE (XForms Common Environment)
. Display manager: 提供登陸許可環境以獲得X Window的控制

我們再從開發者的角度來看一下GUI。以Qt為例,我們在使用Qt組件進行開發時,一般是利用組件中的各種類庫,去響應各種事件輸入(單雙擊滑鼠、鍵盤操作)以及給出相應的輸出到顯示器上。其實際工作的時候,這些工作底層都是通過和window system(X)之間的交互實現的。

這些基本事件的響應,基本的圖像單元的繪製,是window system通過封裝成一個通用的GUI工具集提供給QT(如X的xlib)。對於Qt而言,這個window system可以是X,也可以是QT自行研發的QWS視窗系統。整個應用層的GUI系統則可看作如下:

3.Linux GUI子系統的構成及工作流程

從應用層深入到內核中去。暫不考慮在linux下的GUI,我們知道,單純的顯示圖片的話,整個數據流的走向是這樣的:

即按照一定時序時序,將圖像信息從內存中輸出到顯示接口上。若在生成Frame buffer裡面的圖像數據時不僅通過軟體memory處理,還用到了硬體加速的話,數據流則變為如下:

其中accelerate logic就是顯卡部分(若是SOC的片內GPU模塊,則是通過片內高速總線進行數據交互的,若若是獨立顯卡,一般是通過pci-e高速串行接口進行數據傳輸的)。把這個數據流走向放入Linux中,數據流和控制流都需要和用戶層進行交互,也就是說,Linux下,必須得有相關的軟體驅動給用戶層提供相應的API。這也就是DRM(Direct Rendering Manager)和KMS(Kernel Mode Setting)的角色。

Linux原生系統中提供由DRM+KMS構成的DRI(Direct Rendering Infrastructure)中:

DRM主要負責負責數據流,即通過軟體或硬體,生成目標圖像,存儲在framebuffer中;

KMS主要負責控制流,即針對外置LCD以及指定的顯示模式設置,將生成好了的frame數據信息送到響應display port上(VGA、HDMI等);

Kernel將這兩大快的基本API抽出來封裝成libdrm供X使用,整個應用層+kernel相關的GUI結構如下圖:

整個data flow也替換成了上圖的flow1~flow6。關於DRM和KMS的詳細介紹我們會放到這個系列的第2篇,這裡再提一下涉及到3D的GUI。在需要用到3D圖形交互的場景,往往對著實時性要求較高,X中的server/client之間的數據協議解析以及數據交互導致的延時是這種場景不能容忍的。因此DRI是支持這種app越過X直接和內核交流的方式的。比如,Qt中可以直接通過opengl相關類庫直接調用libdrm中API控制硬體中的Frambuffer軟硬體,此時結構如下:

4.我們能做些什麼

在一個常見的系統研發中,子系統中我們能做的基本就是適配,適配不同的CPU、適配不同的OS、適配不同的顯示設備。而對於專業的GPU研發團隊來說,則需要在現有DRI框架下,為自己的GPU邏輯設計專用的驅動,軟硬體工作量龐大。作為一個高性能計算實驗室,當然要將一些高速計算融進去。在本系列第3篇,我們將會在Xilinx的Zynq7000系列晶片上,利用其中的PL邏輯資源,設計非常簡單的圖像處理IP,加速DRM中的Framebuffer數據並通過HDMI顯示到LCD上。

編輯:hfy

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • PyAutoGUI:自動化鍵鼠操作的Python類庫
    隨便挑了一張看起來比較高端的圖片有些朋友可能玩過按鍵精靈,一個用來操作鍵盤滑鼠完成一些自動化工作的軟體。其實如果你學了Python的話,完全用不著按鍵精靈這種東西了。因為廣泛的Python類庫裡,就有PyAutoGUI這樣可以變成控制鍵盤滑鼠的類庫,有了它,就可以用Python隨心所欲的操作電腦了。
  • Pandas GUI:如何輕鬆獲取Pandas數據幀?
    可以通過以下幾種方式安裝PandasGUI:# from PyPipip install pandasguior# from Githubpip install git+https://github.com/adamerose/pandasgui.git接下來,筆者將通過一個示例來介紹PandasGUI庫的各種功能。
  • 基於嵌入式系統的數字示波器用戶圖形界面的實現
    1 引言  隨著嵌入式系統應用領域的不斷擴大,系統複雜性也在不斷提高。所以在嵌入式系統中實現用戶圖形化(gui),已經成為大勢所趨。目前,嵌入式系統中大多數的用戶圖形化界面(gui)都是在作業系統(如os、wince、linix)的支持下, 調用系統的各種api函數實現的。這些作業系統為實現gui提供了大量的庫函數,也為編程人員提供了界面設計的良好平臺。如利用wince就可以十分方便的設計出具有windows風格的圖形界面。
  • 【圖像處理】基於最小誤差法的胸片分割系統
    = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @MainForm_OpeningFcn, ... 'gui_OutputFcn', @MainForm_OutputFcn, ... 'gui_LayoutFcn', [] , ...
  • 基於嵌入式Linux的語音識別系統硬軟體設計
    2.系統構成與原理  語音識別主要包括兩個階段:訓練階段和識別階段。在訓練或識別過程中,都必須對輸入語音進行預處理和特徵提取。訓練階段通過用戶輸入的若干次訓練語音,經過預處理和特徵提取後得到特徵參數,最後通過特徵參數建模,進而建立訓練語音的參考模型庫。
  • 管理信息系統概述知識題2
    第3章管理信息系統概述    1.管理信息系統及其特點(領會)    1.1管理信息系統的定義    管理信息系統:是一個由人和計算機等組成的,能進行管理信息收集、傳遞、加工、保存、維護和使用的系統。
  • linux下安裝虛擬機,完美在linux系統下運行通達信軟體
    現在越來越多的人使用linux系統,現在很多的國產作業系統都是基於linux內核上的。雖說不少的軟體都可以運行在linux的系統上。但是對於股票軟體來說在linux上的使用是一個硬傷。能夠運行在linux下的國內股票軟體少之又少。
  • MFCC概述及提取流程
    打開APP MFCC概述及提取流程 本站 發表於 2010-08-09 16:07:22   概述  MFCC:Mel
  • 從RTOS到Linux的應用移植
    1 RTOS到Linux的移植分析  幾乎所有的RTOS都有一個簡單的編程模型,它由多線程的執行(通常稱為任務)構成,包含在單一的地址空間中。在RTOS中,單一主程序下多任務同時運行,具有很高的實時響應能力。
  • linux下configure命令詳細介紹
    --program-prefix=PREFIX指定將被加到所安裝程序的名字上的前綴.例如,使用'--program-prefix=g'來configure一個名為'tar'的程序將會使安裝的程序被命名為'gtar'.當和其他的安裝選項一起使用時,這個選項只有當他被`Makefile.in'文件使用時才會工作.
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    多個處理器同時工作,使系統性能大大提高。文件類型普通文件(regular file):就是一般存取的文件,由ls-al顯示出來的屬性中,第一個屬性為 [-],例如 [-rwxrwxrwx]。因為在這個目錄中包含了所有linux系統中使用的外部設備。但是這裡並不是放的外部設備的驅動程序。這一點和常用的windows,dos作業系統不一樣。它實際上是一個訪問這些外部設備的埠。可以非常方便地去訪問這些外部設備,和訪問一個文件,一個目錄沒有任何區別。/etc:etc這個目錄是linux系統中最重要的目錄之一。在這個目錄下存放了系統管理時要用到的各種配置文件和子目錄。
  • 如果我們力推深度Linux系統,會取代微軟的Windows系統嗎?
    【如果我們力推深度Linux系統,會取代微軟的Windows系統嗎?】華為在matebook中已經開始使用深度的Linux系統了,我們甚至一度認為,華為這是在結束微軟系統做準備。實際上,我們確實發現華為的心思很深——為了未來華為在系統方面不受美國微軟等等方面的控制。
  • 關於java中GUI圖行化用戶界面的介紹概述
  • 基於Matlab GUI的整流電路仿真設計[圖]
    其中的電力系統(Pow er System)工具箱是專用於RLC電路、電力電子電路、電機傳動控制系統和電力系統仿真用的模型庫。它具有豐富的器件模型和齊全的分析功能,且操作方便。隨著對仿真和程序設計通用性及可視化需求的日益增加,Mat lab的圖形用戶界面(GUI)應用也越來越廣泛,功能越來越強大。
  • 嵌入式系統中USB主機控制器的設計
    本文引用地址:http://www.eepw.com.cn/article/152226.htm 嵌入式系統被定義為硬體和固件(獨立的或作為更大型系統的一部分)通常帶有某種作業系統,作業系統可以是Windows CE、VxWorks或其它由「自編代碼」構成的更簡單系統。根據這樣的定義,可以認為任何帶有處理器的電子裝置均可以作為USB嵌入式主機。
  • GCP小夥伴們,你們知道什麼是系統嗎?
    在實際工作中這些要素的表現形式多種多樣,可能是一個個體,元器件,也許本身就是由其他要素構成的系統(可稱之為「子系統」)。比如說臨床試驗信息化管理系統組成要素中就有計算機系統、網絡系統等等,這些系統對於臨床試驗信息化管理系統來說就屬於子系統。其次,系統有一定的結構。