2016-12-14 13 views
1

私は何年ものコンピュータを使ってプログラミングした後、実際に画面に描くソフトウェアのスタックはほとんど私にとって謎です。オペレーティングシステムは画面上にウィンドウをどのように描画しますか?

私はいくつかの組み込みLCD GUIアプリケーションに取り組んできましたが、これは単純なスタックについての手掛かりを提供しますが、Windowsオペレーティングシステムのようなものの全体像はまだ暗いです。

Iが知っているから:

  • 最低レベル0は、画面上の特定の色またはグレースケール陰影のピクセルをオンにするデジタルインタフェースを提供し、電子ハードウェア(集積回路)です。インターフェイスはデータシートに記載されていますので、デジタルラインをどのように切り替えてピクセルを望み通りに変えるかを知っています。
  • 次のレベル1はハードウェアドライバです。これは通常、ハードウェアを共通のインタフェースに抽象化します。 SetPixel()などのようなもの
  • 次のレベル2は、2D/3Dグラフィックスライブラリです(そのうちのウィジェット/シングルスクリーンエクスペリエンスは制限されています)。下のレベルは、画面上のピクセルを表すバッファまたはメモリの範囲を提供するように見えます。グラフィックスライブラリはこれを抽象化するので、DrawText( "text"、10、10、 "font")のような関数を呼び出すことができ、適切な方法でピクセルを設定します。

  • 次のレベルはOSの魔法です。ウィンドウ/ボタン/フォーム/ WPF/etcはメモリに作成され、適切なドライバにルーティングされ、画面の特定の部分にも導かれます。

しかし、Windowsのようなものはどのように機能しますか?

  • 私はGPUがレベル0とレベル1の間に収まると仮定します。GPUはディスプレイ上のピクセルを直接駆動し、レベル1のドライバはGPUドライバです。 GPUが提供する追加機能を有効にするために利用可能な機能がさらにあります。 (OSは3D空間内の三角形の配列を通過し、GPUはこれを3Dパースペクティブビューで処理し、それを画面上にチャッキングしますか?)

私にとって最大の謎あなたが物事の窓の一部に入るときです。スケッチアップ、ビジュアルスタジオ、FPSゲームがすべて同時に実行され、それらの間で切り替えることができます。場合によっては、画面上にタイルを張ったり、複数の画面にまたがったりすることもできます。これはどのように追跡されレンダリングされますか?これらのそれぞれはバックグラウンドで実行されなければならず、OSは画面のどの部分にどのグラフィックス・パイプを接続しなければならないかを述べなければならない。 Windowsは画面のこの部分が3Dゲームであり、この部分は2D WPFアプリケーションなどとはどのように言いますか?

これ以外にも、DirectXはあるアプリケーションで使用し、Qtを別のアプリケーションで使用しています。同じ技術を使っている複数のゲームやアプリを実行していることを覚えています。私はあなたがアプリケーション - >グラフィックスライブラリ(DirectX、WPFなど) - >フレームバッファ - > Windowsディレクター(画面のどこに、このフレームバッファをスケーリングする必要がありますか?

最終的には、どのピクセルをどの色にするべきかをトグルビットで表していますが、そこに到達する途中で多くのトグルビットが発生します。

Visual Studioを起動して基本的なWPFアプリケーションを作成すると、画面にボタンをドロップして開始するとバックグラウンドで何が起こっているのですか?私はVSデザイナーをドロップしてXAMLで作成し、組み込みシステムではピクセル単位で手動で描画することもありましたが、このサンドイッチのいわゆる肉です。

私はAndroid、iOS、Windows、Linuxを使用していますが、一般的な機能と思われますが、私が上に概説したものの説明を見たことも聞いたこともありません。

これはどのように機能するのか誰にでも分かりますか? x86のを仮定

答えて

1

VGA

は、VGAメモリは(グラフィックモード用のテキストモードと0x000A0000ため0x000B8000)最低1 MIBの標準的なビデオ・バッファ・アドレスにマッピングされます。また、カードの動作を制御する多くのVGAレジスタがあります。モード0x12(16色640x480)とモード0x13(256色320x200)の2つの広く使用されるビデオモードがありました。モード0x12はVGAレジスタを用いてプレーン(青、緑、赤、白)を切り替えることを含み、モード0x13はVGAレジスタを使用して変更可能な256色のパレットを有する。

通常、VGAを使用するOSは、起動時にBIOSを使用してモードを設定し、実行時に適切なVGAレジスタに書き込みます(実行していることがわかっている場合)。画面に描画するには、ビデオドライバはビデオメモリ(モード0x13)に書き込むか、VGAレジスタへの書き込み(モード0x12)と組み合わせるだけです。

現在使用されているほとんどのカードは、現在(一部)VGA互換です。

VBE

は、何年か後に、VESAはビデオカード用の標準インタフェースた「VESA BIOS拡張機能」を、発明し、高解像度と大きい色深度を可能にしました。ビデオメモリは、バンクモードとリニアフレームバッファの2つの方法で露光されました。バンクモードでは、ビデオメモリの小さな部分がローアドレス(0x000A0000)に公開され、ビデオドライバは、画面が更新されるたびにほぼいつでもバンクを切り替える必要があります。リニアフレームバッファは、ビデオメモリ全体を非標準の高アドレスにマッピングするはるかに便利なソリューションです。

起動時に、OSはVBEインターフェイスを呼び出して、サポートされているモードを照会し、最も便利なモードを設定するか、VBEインターフェイスをバイパスし、必要なビデオハードウェアレジスタに直接書き込みますやっている)。バンクモードとリニアフレームバッファの間では、ビデオドライバはビデオメモリがマッピングされている指定されたメモリアドレスに書き込みます。

今日使用されているほとんどのカードは、(部分的に)VBE互換です。

現代のビデオインタフェース

最も近代的なビデオインタフェースは通常、広くVGAおよび/またはVBEなどとして文書化されていません。しかし、ビデオメモリは依然としてアドレスにマッピングされ、ハードウェアレジスタおよび/またはバッファはグラフィックスカードの動作に関する変更可能な情報を含む。違いは、インタフェースがもはや標準化されておらず、今日では高度なOSが各グラフィックスカードに異なるドライバを必要とすることです。

+0

ありがとうございましたglauxosdever!私が知っていることから、これは上記の私の説明のレベル0 /レベル1のように聞こえる。しかし、これがより高いレベルをどのように見えるかまだ分かりません。 LinuxやWindows自体の「ウィンドウマネージャー」まで理解するのはかなり簡単です。非ウィンドウOSは単純だと思われますが、グラフィックスカードの有無にかかわらずウィンドウマネージャーを起動すると、ボンネットの下で何が起こるかについての情報を見つけることができません。内部的には、WindowsはグラフィックスAPIを参照するだけで、グラフィックスがグラフィックコントローラのハードウェアにパイプされているかどうかを、基本となるドライバシステムで処理しますか? – Dru

+0

通常、ウィンドウマネージャは下位のグラフィックスAPIを呼び出します。下位のグラフィックスAPIはグラフィックスドライバを呼び出します(カーネルが呼び出してから呼び出されます)。かっこ内のテキストが関連するかどうかは、カーネルがモノリシックなものか、またはマイクロカーネルのものかによって異なります。 – glauxosdever

関連する問題