web-dev-qa-db-ja.com

ドライバーがロードされる前に、CPUはGPUとどのように通信しますか?

私が理解しているように、GPUには独自の命令セットがあり、その命令はグラフィックスドライバーによって生成されます。次に、GPU命令がGPUに送信されます。では、ドライバーがロードされる前にグラフィックス通信はどのように機能するのでしょうか?コンピューターが基本的な表示タスクを実行できるようにするために、GPUが最低限実装する必要のある基本命令はありますか?

24
VortixDev

「基本的な指示はありますか...?」はい、正確に。すべてのGPUは、いくつかのシンプルなインターフェイスの1つを実装する必要があります-それらは「命令セット」と呼ばれるには原始的すぎる-OSに含まれているプラ​​ットフォームファームウェア(「BIOS」または「UEFI」)とドライバーはどのように対話するかを知っています。最近の「単純なインターフェース」の通常の選択は「VGA」(「ビデオグラフィックスアレイ」)で、これは元々その規格のビデオカード用に定義されたレジスタレベルのインターフェースです。 (今30歳以上!)

たとえば、Windowsシステムのデバイスマネージャーがグラフィックカードを「Microsoft Basic Video Adapter」として識別した場合、OSはカードの特定のドライバーを見つけることができず、代わりにVGA互換ドライバーをロードしました。

まあ、技術的には、Windowsがalwaysでそのドライバをロードし(たとえば、ブートの進行状況画面を表示できるように)、次に(ブートのかなり遅い段階で)識別してロードしますグラフィックカードの「実際の」ドライバ。

VGA規格は、いくつかの低解像度グラフィックスモードとテキストモードのみをサポートし、GPUで「実行中のプログラム」または「命令」と呼んでもかまいません。本質的に、システムファームウェアまたは「ベースビデオドライバー」は、それを目的のモードに設定して、ビットマップにビットを書き込みます。ビットマップのビットは、画面上のピクセルに直接対応しています。線または曲線を描くために実行する必要があるすべての演算は、CPUで実行されます。これは、ものを画面に表示するための非常に低レベルで遅い方法です。ただし、OSのインストールや初期のブート進行画面など、ファームウェアからの表示やファームウェアとの簡単なやり取りには十分です。

Wikipedia:Video Graphics Array

32
Jamie Hanrahan

古いハードウェアがどのように機能したかを説明することによって、このすべての背後にある「ブードゥー」を片付けようとします。最近のGPUはこのように動作しませんが、CPUとグラフィックカードのインターフェイスをエミュレートします。

tl; dr

80年代と90年代前半のグラフィックチップ/カードは、(クロック速度に比べて)非常に高速に出力を生成する必要があったため、命令を実行せず、固定回路を備えていました。彼らはちょうどRAMからデータを吸い出したので、CPUはRAMに適切な場所にデータをダンプする必要があり、グラフィックチップはCPUはグラフィックチップにさまざまな構成変数を設定することもできます。

詳細:

80年代には、家庭用コンピュータには、いくつかの固定された動作を持つ、本当に「ダムのない」グラフィックチップがありました。パイプラインを逆にたどるのが最も理にかなっています。

CRTモニター

これらのモニターにはアナログ入力が必要でした。つまり、電圧が高いほど出力が高くなります。カラーモニターには3つのチャネル(赤、緑、青)がありました。 (または、例 YUVまたはYIQ)。これらの電圧は、電子ビームの強度を調整しました。シンプルなもの。

CRTモニターは、文字通り電磁石を使用して電子ビームを左から右に偏向し、次に少し下から開始して左から右へ、というように上から下へとモニターします。その後、先頭に戻って繰り返します。

[〜#〜] dac [〜#〜]

グラフィックチップには、「デジタル-アナログ」コンバーター(非常に 一般的な電気部品 )がありました。これは、デジタル値(2、4、8ビットなど)をモニターに供給できる電圧に変換しました。

スキャン

グラフィックスチップは、電子ビームに「追いつく」必要があり、適切な値をDACに送信して、対応する電圧を適切なタイミングで出力できるようにしました。 (これにはクロックを使用していません。)ここで命令を実行する時間はありませんでした。すべてがハードワイヤードであり、少数の固定クロックサイクルを要しました。

ビデオモード

初期のチップはそれほど高速ではなく、RAMも限られていた。このため、背景色、フォントの選択、カーソルの位置とサイズ、パレットの選択、スプライトなど、さまざまなモードやその他の構成パラメーターを選択できる傾向がありました。ほとんどが高解像度の「文字のみ」モードと低解像度のピクセル単位モードを提供していました。

3つの注目すべきVGAモードは次のとおりです。

  • 16(ish)カラー80x25テキストモード(これは、基本的にはBIOSロード画面がどのように見えるかです)
  • 16色640x480高解像度モード
  • 256色320x200ハイカラーモード

ペイントピクセル

非常に大まかに、グラフィックスシステムに応じて、パイプラインは次のようになります。

現在のピクセル位置⇒文字/フォント/スプライト/ピクセル/構成データの処理⇒ピクセル値⇒パレット⇒DAC

いくつかのRAM場所から読み取る必要があるのは、その2番目のステップです。たとえば、テキストモードでは、1バイト文字が検索されます。これにより、フォントテーブルへのインデックスが形成されます。 。このテーブルからビットが検索され、そのピクセルがフォアグラウンドまたはバックグラウンドのどちらの色であるかが示されます。3番目のバイトがフェッチされて、そのフォアグラウンド/背景のカラーが取得されます。全部で、3バイトがRAMから読み取られます。

しかし、この「フロー」は、まさに、まさに説明したフローとまったく同じように配置された単純な固定回路のセットです。

メモリバスインターフェイス

Intel CPUには、IOバスと呼ばれるこの厄介なレガシー機能がありますが、それは重要ではないので、そこにないふりをします。

CPUは、メモリバス上のREADまたはWRITE要求とアドレスをブロードキャストすることにより、RAMにアクセスします。有効なアドレスのほとんどはRAMからの応答を引き出しますが、特定の範囲はdevices代わりに、たとえば、特定のアドレスからの読み取りでは、キーボードのキー操作に関する情報が得られる場合があります。

「グラフィックス範囲」の適切な部分に書き込むことにより、画面の内容とグラフィックカードの構成パラメーターの両方を書き込むことができます。 「ダム」グラフィックチップは命令を実行しません。数バイトが回路を流れ、電圧を出力しているだけです。

VGAでは、実際にグラフィックカードにRAMが存在します。これは、書き込まれる前にデータを前処理するようにグラフィックカードを構成できるためです。一部の状況でパフォーマンスを向上させるグラフィックRAM。

[〜#〜] vesa [〜#〜]

VGA後のグラフィックスカードは、より高い解像度と良好な色深度を提供しましたが、同様の原理で機能しました。多くの最新のグラフィックスカードは、これとの互換性を提供して、起動時の解像度を高めます。しかし、VGAは、ほとんどすべてのカードがエミュレートする「フールプルーフ」なものです。

16
Artelius