GNU/Linux >> Linux の 問題 >  >> Linux

Linux GUI は最低レベルでどのように機能しますか?

仕組み (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 は、メモリ経由で直接アクセスするため、さまざまなグラフィックス ハードウェアについて知る必要があります。

(特にセキュリティ モデルが変更され、ALL にアクセスできなくなる可能性があります) )

Linux

一番下は Linux (カーネル) で、システムの小さな部分です。ハードウェアへのアクセスを提供し、セキュリティを実装します。

ヌー

次に、Gnu (ライブラリ; bash; tools:ls など; C コンパイラなど)。オペレーティング システムのほとんど。

X11 サーバー (x.org など)

次に、基本 GUI サブシステムである X11 (または Wayland、または ...)。これはユーザーランド (カーネルの外側) で実行されます。これは、いくつかの特権を持つ単なる別のプロセスです。カーネルは、ハードウェアへのアクセスを許可することを除いて、関与しません。また、他のプロセスが X11 サーバーと通信できるように、プロセス間通信を提供します。

X11 ライブラリ

X11 用のコードを記述できるようにする単純な抽象化。

GUI ライブラリ

次は qt、gtk、sdl などのライブラリです。これにより、X11 の使用が容易になり、wayland、Microsoft の Windows、または MacOS などの他のシステムでの作業が容易になります。

アプリケーション

アプリケーションはライブラリの上にあります。

プログラミング用のいくつかの低レベル エントリ ポイント

xlib

xlib を使用することは、X11 について学ぶ良い方法です。ただし、最初に X11 について読んでください。

SDL

SDL は、直接描画できるビットプレーンへの低レベル アクセスを提供します。

下降中

より低くしたい場合は、現時点でどのオプションが適切かはわかりませんが、いくつかのアイデアがあります.

  • 古い Amiga またはシミュレーターを入手します。そして、いくつかの優れたドキュメント。例えばhttps://archive.org/details/Amiga_System_Programmers_Guide_1988_Abacus/mode/2up (これと類似の本を 2 冊持っていました)
  • ラズベリー パイで何ができるか見てみましょう。これについては調べていません。

リンク

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/


ctrl-alt-delor の回答は、一般的なアーキテクチャの概要を示しています。より実践的なアプローチとして、「Linux カーネルと C でのプログラミングだけ」に関する回答を提供します。

私は時々フレームバッファに直接書き込むのが好きです。フレーム バッファ デバイス ドライバは、「これが最終的にどのように画面に表示されるのか」という面倒なハードウェアに近い作業をすべて実行します。ルート シェルを使用してすぐに実行できます:

echo -n -e '\x00\x00\xFF' > /dev/fb0

私の 32 ビット フレーム バッファで最初 (左上) のピクセルを赤に設定します。

/dev/fb0を開いてバイトを書き込むことにより、C内から完全に行うことができます。メモリ マッピングはあなたの友達になることができます。これは、X サーバーがない場合、または仮想コンソールでのみ機能します。 Ctrl+Alt+F1 を押してアクセスします。

PS:マウスの動きなどのランダムなデータを視覚化するのも楽しい場合があります:

cat /dev/input/mouse0 > /dev/fb0

PPS:事実上すべての現実世界のデスクトップ アプリケーションは、描画、3D、およびビデオ レンダリングのためのハードウェア アクセラレーションなどの凝ったもののために、ハードウェアへのより直接的なアクセスを必要とすることにも注意してください。単純なフレーム バッファ デバイスでは、これはうまくいきません。


ncurses から始めることを強くお勧めします。

より複雑なグラフィック システムとは異なり、純粋にテキストに基づいているため、スクリーン ドライバやグラフィック ライブラリの詳細にこだわる必要はありません。ただし、画面上にウィンドウを配置する、ウィンドウ間でフォーカスを移動するなどの基本原則は依然として当てはまります。また、単一の文字ブロックや ASCII アートのレベルで描画を行うこともできます。

もちろん、これはまだライブラリの上に構築していますが、簡単に理解できるライブラリです。それだけでなく、ソース コードが自由に利用できるライブラリであり、十分に文書化されており、読みたい場合に難しすぎることはありません。必要に応じて、自分で変更することもできます。または、そこにあるすべてのライブラリ関数を調べて、必要な API を見つけ、その設計に基づいてゼロから作成することもできます。


Linux
  1. 「ls」コマンドは Linux/Unix でどのように機能しますか?

  2. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  3. Linux カーネルは __init 呼び出しの順序をどのように決定しますか?

  1. 使用中の Linux ディストリビューションを特定するにはどうすればよいですか?

  2. Linux でスタック割り当てはどのように機能しますか?

  3. ps コマンドはどのように機能しますか?

  1. .bashrcの目的とそれはどのように機能しますか?

  2. ループバック インターフェイスはどのように機能しますか

  3. <( cmd ) パターンは bash でどのように機能しますか?