
オペレーティング システム開発のチュートリアルでは、VGA または EGA またはスーパー VGA に直接書き込むことで画面データに到達することを正確に説明していますが、ディスプレイ用の固定アドレスに書き込むことと、オンボードまたはリムーバブルのビデオ カードに直接書き込むことの実際の違いがわかりません。この問題に関する私の混乱の基本的な説明が欲しいだけです。
また、カード、接続インターフェイス、バス、アーキテクチャ、システム オン チップ、組み込みシステムなどの変数についてはそれほど単純なケースではないため、この背後にある考え方を 100% 理解する方法を見つけるのは難しいと思います。固定アドレスは、ハイエンドの GPU とローエンドのオンボード GPU では異なるのでしょうか。その理由と、そうでない理由を教えてください。
カーネルをホストし、オペレーティング システムを作成することは、プログラミングにおける私の目標の 1 つですが、これは確かに実現不可能な夢です。用語を理解できないと、いくつかの領域で障害になるだけでなく、ハードウェアの分野では愚か者のように見えてしまいます。
追加情報: 現在の回答の一部では、16 ビットの詳細でプロセッサの最大アドレス可能メモリの使用について言及されています。問題は、次のようなその他の問題が発生することです。
1. カード自体のメモリはどうですか? 画面データ自体にはシステム RAM は必要ありません。
2. 上位ビットモードではどうでしょうか? また、リアルモード (x86) で BIOS を無視して、AL を通じてメモリをアドレス指定することはできないのでしょうか?
3. 多数のレジスタを持ち、実際のマイクロプロセッサと同等以上のパフォーマンスを持つ GPU では、固定アドレスへの書き込みの概念はどのように変わるのでしょうか?
答え1
技術的にはVGAはビデオグラフィックスアレイ1987 年に導入された 640 x 480 のビデオ規格です。当時、特にカラー ディスプレイとしては比較的高い解像度でした。
前にVGAが導入された後、いくつかの他のグラフィック規格が登場しました。ヘラクレステキスト (25 文字の 80 行) または比較的高解像度のモノクロ グラフィック (720 x 348 ピクセル) を表示します。
当時の他の規格としてはCGA(カラーグラフィックアダプター) では、最大 640 x 200 ピクセルの解像度で最大 16 色まで表示できました。その結果は次のようになります。
最後に、注目すべき PC 標準は、64 色で最大 640×350 の解像度を可能にした拡張グラフィック アダプター (EGA) でした。
(この説明を比較的短くするために、PC 以外の標準については無視しています。Atari または Amiga の標準 (当時は最大 4096 色) を追加し始めると、この説明はかなり長くなります。)
その後、1987年にIBMはPS2コンピュータを発表しました。このコンピュータは、マウスとキーボード用の新しいポート(以前はマウスは25ピンシリアルポートまたは9ピンシリアルポートを使用していましたが、もしマウスさえあれば、標準の 3.5 インチ ドライブと、高解像度と多色性を備えた新しいグラフィック アダプタが付属します。
このグラフィック規格はビデオグラフィックスアレイ3 列 15 ピン コネクタを使用してアナログ信号をモニターに転送します。このコネクタは数年前まで使用されていましたが、その後、DVI やディスプレイ ポートなどの優れたデジタル規格に置き換えられました。
VGAの後
VGA規格の進歩は止まりませんでした。VGAの導入後すぐに、800x600などの新しい規格が登場しました。ス同じコネクタを使用する上位 VGA (SVGA)。(Hercules、CGA、EGA などはすべて独自のコネクタを持っていました。十分に低い解像度を表示しようとした場合でも、CGA モニターを VGA カードに接続することはできませんでした)。
それ以来、私たちははるかに高解像度のディスプレイに移行しましたが、最もよく使われる名前は依然として VGA です。正しい名前は SVGA、XVGA、UXGA などですが。
(画像はWikipediaより引用)
「VGA」と呼ばれるもう 1 つのものは、オリジナルの VGA カードで使用される DE15 コネクタです。この通常は青いコネクタは、アナログの「VGA 信号」をモニターに転送する唯一の方法ではありませんが、最も一般的な方法です。
左: DB5HD 右: 代替 VGA コネクタ (通常は品質向上のために使用される)
「VGA」が使用される 3 番目の方法は、グラフィック カードを説明することですが、そのカードは VGA とはまったく異なる解像度を生成する可能性があります。この使用法は技術的には間違っており、少なくとも「VGA 互換カード」であるべきですが、一般的な会話ではその違いは認識されません。
つまりVGAへの書き込み
これは、IBM XT のメモリの分割方法に由来しています。CPU は最大 1MiB (1024KiB) のメモリにアクセスできます。下位の 512KiB は RAM 用に予約され、上位の 512KiB はアドイン カードや ROM などに予約されています。
この上部の領域は、VGA カードのメモリがマップされている場所です。ここに直接書き込むと、結果がディスプレイに表示されます。
これは VGA だけでなく、同世代の代替品にも使用されました。
G = グラフィックモードビデオ RAM M = モノクロテキストモードビデオ RAM C = カラーテキストモードビデオRAM V = ビデオ ROM BIOS (PS/2 では「a」) a = アダプタボードのROMと専用RAM(空きUMAスペース) r = 追加の PS/2 マザーボード ROM BIOS (非 PS/2 システムでは無料の UMA) R = マザーボード ROM BIOS b = IBM カセット BASIC ROM (IBM 互換機では「R」) h = HIMEM.SYS がロードされている場合の高メモリ領域 (HMA)。 従来型(ベース)メモリ: 最初の 512KB (または 64KiB の 8 つのチャンク)。 上位メモリ領域 (UMA): 0A0000: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG 0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 0C0000: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVああああああああああああああ 0D0000: ああああああああああああああああああああああああああああああああああ 0E0000: rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbRRRRRRRR
(ソースASCII マップの)。
答え2
「固定アドレス」への書き込みだった基本的にビデオ カードに直接書き込みます。これらのすべてのビデオ ISA ビデオ カード (CGA、EGA、VGA) には、基本的に CPU のメモリと I/O スペースに直接マップされた RAM (およびレジスタ) がいくつかありました。
したがって、特定のメモリ位置にバイトを書き込むと、実際にはビデオ カード上にあるメモリに書き込んでおり、ビデオ カードはそのメモリを使用するため、その文字 (テキスト モード) がすぐに画面に表示されます。
これは今日では非常に混乱しているように見えます。特に、今日のビデオ カードは VGA と呼ばれることがあることを考えると (そして、それらは 1990 年代の「真の」VGA カードによく似ています)、これは混乱を招きます。ただし、最新のカードでも、これらの古い設計の機能の一部はエミュレートされます (ほとんどの最新の PC で DOS を起動し、ビデオ メモリに直接書き込む DOS プログラムを使用できます)。もちろん、今日では、すべてビデオ カードのファームウェアでエミュレートされています。
答え3
実際には違いはありません。ビデオ メモリのアドレスに書き込む場合、ハードウェアはそれをビデオ カードにルーティングします。
独自のオペレーティング システムを作成する場合は、PCI バスをスキャンしてカードを見つけるところから始めて、グラフィック カードのメモリを希望どおりにマップするためにかなりの作業が必要になるでしょう。
答え4
これまでの回答では、古いビデオ カードはビデオ メモリをプロセッサのアドレス空間にマップすることで動作していたと説明されています。これはカード自体のメモリです。ノースブリッジは、このマップされたメモリの要求を VGA デバイスにリダイレクトすることを認識しています。
さらに、VGA 互換カードには多くの拡張機能と新しいモードがありました。これにより、を介して動作する VESA BIOS 拡張機能 (VBE) が作成されましたint 10h
。これは、基本的な 2D アクセラレーション (BitBlt)、ハードウェア カーソル、ダブル/トリプル バッファリングなどをサポートします。これは、サポートされているすべての解像度 (高解像度を含む) でフルカラー表示を行うための基本的な方法です。これは通常、カード内部のメモリも使用し、ノースブリッジは従来の VGA のようにリダイレクトを実行します。これは、フルカラー/フル解像度のグラフィックスを利用する最も簡単な方法です。
次に、BIOS を使用せずに GPU に直接アクセスする方法をいくつか紹介します。これにより、VBE と同じ機能、およびおそらく追加の機能にアクセスできます。この点については、私の理解がかなり曖昧です。このインターフェイスはデバイス固有だと思いますが、まったく確信がありません。
さらに、3D アクセラレーションや GP-GPU 計算などをサポートできる GPU インターフェイスもあります。これを完全に使用するには、製造元が提供するドライバーや仕様が必ず必要であり、同じ製造元のデバイス間でも大きな違いがあることがよくあります。