仕組み (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 を見つけ、その設計に基づいてゼロから作成することもできます。