私は基本的にLinuxカーネルとCプログラミングだけを使って最初からGUIを作成する方法を理解しようとしています。
GUIデスクトップ環境を最初から作成したくないが、一部のデスクトップアプリケーションを作成したいのですが、ナレッジ検索で見つけることができるすべての情報は、GUI APIとツールキットに関するものです。少なくともLinux GUIの作成方法の基本的な理解から、APIやツールキットを使用せずにGUI環境やGUIアプリケーションを作成する方法を知りたいです。
たとえば、次のようになります。
既存のAPIとツールキットは、カーネルへのシステムコールを介して機能します(カーネルは、最も低いレベルでピクセル単位などのGUIイメージを構築します)。
これらのツールキットによって実行されるシステムコールは、単に情報を画面ドライバに渡します(すべての画面ドライバが準拠するこの情報を送信するための標準形式はありますか、またはGUI APIが特定の画面に従って複数の形式で出力できる必要がありますか? ) /driver この情報は何ですか?) おおよそこれが正しい場合、元のLinuxカーネルは通常8ビット文字形式でのみ情報を画面に転送しますか?
私はただLinuxカーネルの間で何が起こるのか、画面に見えるもの(わかっている場合は、ソフトウェアとハードウェアを介した制御/情報の流れ、情報の形式など)を理解したいと思います。細かい説明本当に感謝し、詳しく説明するのが難しいかもしれないことは分かりますが、このような説明が気になって学んでいる他の方には良い資料になりそうです。文脈を言うと、私は最近、システムプログラミングの過程でCプログラミングを始めたコンピュータサイエンスの3年生です。そしてLinuxとプログラミングについてある程度の知識を持っています(またはそう説明します)。私を助けてくれた皆さんにもう一度感謝します!
答え1
仕組み(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サーバー(xorgなど)
そして、基本的なGUIサブシステムであるX11(またはWaylandまたは...)があります。ユーザーモード(カーネル外)で実行されます。これはいくつかの権限を持つ別のプロセスです。カーネルはハードウェアへのアクセスを提供する以外には関与しません。他のプロセスがX11サーバーと通信できるようにプロセス間通信を提供します。
X11ライブラリ
X11用のコードを書くことができる簡単な抽象化です。
グラフィカルユーザーインターフェースライブラリ
以下は、qt、gtk、sdlなどのライブラリです。 X11 タスクを簡単に作成し、wayland、Microsoft Windows、MacOS などの他のシステムでも動作します。
適用分野
アプリケーションはライブラリの上部にあります。
プログラミングのためのいくつかの低レベルエントリポイント
拡張ライブラリ
xlibを使うことはX11について学ぶ良い方法です。しかし、まずX11について少し読んでください。
杉の木
SDLは低レベルアクセス、つまりビットプレーンへの直接アクセスを提供するため、直接描画できます。
さらに降りる
より低いレベルに行きたい場合は、現在のところ良いオプションがあるかどうかはわかりませんが、ここにいくつかのアイデアがあります。
- 古いAmigaやエミュレータを購入してください。良い文書もあります。例えばhttps://archive.org/details/Amiga_System_Programmers_Guide_1988_Abacus/mode/2up(私はこの本に似た2冊の本を持っています。)
- Raspberry Piで何ができるかをご覧ください。私はまだこれについて調査していません。
リンク
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/
答え2
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、ビデオレンダリングのハードウェアアクセラレーションなどの高度な機能を有効にするために、ハードウェアに直接アクセスしたいと考えています。単純なフレームバッファ装置はこれらの操作を正しく実行しません。
答え3
から始めることを強くお勧めします。呪い。
より複雑なグラフィックシステムとは異なり、これは純粋にテキストベースであるため、スクリーンドライバとグラフィックライブラリの詳細にとらわれる必要はありません。しかし、画面にウィンドウを配置し、ウィンドウ間でフォーカスを移動する基本原則はまだ適用されています。単一文字ブロックとASCIIアートレベルでいくつかの絵を描くことができます。
もちろんまだ図書館の上に建てているが、簡単に理解できる図書館だ。しかも無料のソースコードを含むライブラリであり、文書化もうまくいっていて、読みたいときに大きく混乱することもありません。必要に応じて自分で編集することもできます。あるいは、必要なAPIを見つけるためにすべてのライブラリ関数を調べて、そのデザインに基づいて最初から直接作成することもできます。
答え4
SunOS 5には、SPARCシステムでDOOMをサポートするさまざまなcg [3,6,14]、TCX、またはLEOグラフィックアダプタへのデバイスに依存しないアクセスを提供するDGAライブラリがあります。
cg6は8ビットで、擬似カラービジュアルオブジェクトのためにX11で一般的に使用されていますが、8ビットトゥルーカラーも提供できますが、tcxとleoは24ビット加速3Dディスプレイフレームバッファです(擬似カラー= videoramの1バイトはaラージ索引)表は3x8 RGB値を提供し、表の内容を簡単に変更できます。 )cg3はほぼ同じ機能を持っていましたが、スピードアップはありませんでした。 (cg6デザイナーはその後、nVidiaという別の会社を設立しました。)
ATI Rage Pro チップセットベースの PGX などの最新のデバイスは、トゥルーカラーと偽色の両方をサポートできませんが、古いデバイスはサポートしています。これにより、ユーザーは擬似カラーモデル用に作成されたレガシーアプリケーション(または可能であればソフトウェアアップグレード)とTrue Color指向アプリケーションのみを実行から選択する必要があります。
仮色が存在した理由は、1980年代半ばから1992年頃まで、ビデオ価格が非常に高価だったからです。利用可能なワークステーションタイプの解像度をサポートするカラーモニタもかなり高価です(1984年のSun 2は白黒から1152×864の解像度を持っていましたが、1989年頃のMG1は1600×1280の解像度を持っていましたが白黒でした)。
私はX11がサポートしなければならないさまざまな要件を示したかったので、この記事を書きました。