Linux

linux GUI 如何在最低級別工作?

  • February 23, 2020

我基本上是想弄清楚如何從零開始製作一個 GUI,只需要 linux 核心和 C 語言程式。

我不打算從頭開始創建 GUI 桌面環境,但我想創建一些桌面應用程序,並且在我尋找知識的過程中,我能夠找到的所有資訊都是關於 GUI API 和工具包的。我想知道,至少為了了解如何製作 linux GUI 的基礎知識,如何在不使用任何 API 或工具包的情況下製作 GUI 環境或 GUI 應用程序。

我想知道例如:

  1. 現有的 API 和工具包通過對核心的系統呼叫來工作(核心在最低級別負責以像素或其他方式建構 GUI 圖像)
  2. 這些工具包執行系統呼叫,只是將資訊傳遞給螢幕驅動程序(是否有標準格式用於發送所有螢幕驅動程序都遵守的此資訊,或者 GUI API 是否需要能夠根據特定螢幕/驅動程序以多種格式輸出此資訊? ) 如果這大致屬實,那麼原始 linux 核心是否通常只是以 8 位字元的形式將資訊發送到螢幕?

我真的很想了解 linux 核心之間發生了什麼,以及我在螢幕上看到的內容(如果您知道,控制/資訊流通過軟體和硬體,資訊採用什麼格式等)。我將非常感謝詳細的解釋,我知道這可能是一個足夠詳細的解釋,但我認為這樣的解釋對於其他好奇和學習的人來說是一個很好的資源。對於上下文,我是一名 3 年級的 comp sci 學生,最近開始在我的系統程式課程中使用 C 進行程式,並且我對 linux 和程式有中級(或者我會這樣描述)理解。再次感謝任何幫助我的人!!!

它是如何工作的(Gnu/Linux + X11)

概述

它看起來像這樣(不是按比例繪製)

┌───────────────────────────────────────────────┐
│                       User                    │
│     ┌─────────────────────────────────────────┤
│     │             Application                 │
│     │            ┌──────────┬─────┬─────┬─────┤
│     │            │      ... │ SDL │ GTK │ QT  │
│     │            ├──────────┴─────┴─────┴─────┤
│     │            │            xLib            │
│     │            ├────────────────────────────┤
├─────┴───┬────────┴──┐         X11             │
│   Gnu   │ Libraries │        Server           │
│   Tools │           │                         │
├─────────┘           │                         │ 
├─────────────────────┤                         │
│   Linux (kernel)    │                         │
├─────────────────────┴─────────────────────────┤
│                    Hardware                   │
└───────────────────────────────────────────────┘

我們從圖中看到,X11 主要與硬體對話。但是,它需要通過核心進行對話,才能最初訪問該硬體。

我對細節有點模糊(我認為自從我上次研究它以來它發生了變化)。有一個設備/dev/mem可以訪問整個記憶體(我認為是物理記憶體),因為大多數圖形硬體都是記憶體映射的,這個文件(看到一切都是文件)可以用來訪問它。X11 會打開文件(核心使用文件權限來查看是否可以這樣做),然後 X11 使用mmap將文件映射到虛擬記憶體(使其看起來像記憶體),現在記憶體看起來像記憶體。之後mmap,不涉及核心。

X11 需要了解各種圖形硬體,因為它通過記憶體直接訪問它。

(這可能會發生變化,特別是安全模型,可能不再允許訪問所有記憶體。)

Linux

底部是 Linux(核心):系統的一小部分。它提供對硬體的訪問,並實現安全性。

牛羚

然後是 Gnu(庫;bash;工具:ls 等;C 編譯器等)。大多數作業系統。

X11 伺服器 (egxorg)

然後是基本 GUI 子系統 X11(或 Wayland,或…)。這在使用者域(核心之外)執行:它只是另一個程序,具有一些特權。核心不參與,除了提供對硬體的訪問權限。並提供程序間通信,使其他程序可以與X11伺服器進行通信。

X11 庫

一個簡單的抽象,允許您為 X11 編寫程式碼。

圖形使用者界面庫

接下來是 qt、gtk、sdl 等庫——它們使 X11 的使用變得更容易,並且可以在其他系統上工作,例如 Wayland、Microsoft 的 Windows 或 MacOS。

應用

應用程序位於庫之上。

一些低級入口點,用於程式

xlib

使用 xlib,是了解 X11 的好方法。但是,請先閱讀有關 X11 的資訊。

SDL

SDL 將為您提供低級訪問權限,直接訪問位平面供您直接繪製。

走低

如果您想降低,那麼我不確定目前有哪些好的選擇,但這裡有一些想法。

連結

X11

https://en.wikipedia.org/wiki/X_Window_System

現代方式

寫這篇文章引起了我的興趣,所以我看看現代快速的方法是什麼。以下是一些連結:

https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/

引用自:https://unix.stackexchange.com/questions/568634