(0x31)などのバイトを物理線形アドレスのVGAテキスト(モード03)フレームバッファーに格納すると、16ビットのレガシーBIOS MBRモードで起動した最新のPCハードウェアで実際に何が起こりますか? そのリージョンのMTRRがUCに設定されているストアはどのくらい遅いですか? (Kaby Lake iGPUラップトップ1台での実験的テスト'1'
B8000
mov [es:di], eax
、WC上のclflushoptがVGAメモリのUCとほぼ同じ速度であることを示しています。しかし、clflushopt mov
がないと、WCメモリへのストアはCPUを離れず、画面をまったく更新せず、超高速で実行されます。)
すべてのストアのSMIではない場合、実際にリアルモードで再起動せずにパフォーマンスを実験するために、ユーザー空間のWBメモリのチャンクでこのコストを概算する方法はありますか?(たとえば、実際にはどこにも表示されないふりフレームバッファとしてBSSページを使用する)。
対応するフォントグリフは次の更新時に画面に表示されますが、ハードウェアスキャンアウトは実際にVRAM(またはiGPUの場合はDRAM)からASCII文字を読み取り、ビットマップフォントグリフに即座にマッピングしていますか?または、各ストアまたはvblankごとに1つのソフトウェアインターセプトがあるため、実際のハードウェアはビットマップフレームバッファーのみを処理する必要がありますか?
レガシBIOSブートは、システム管理モード(SMM)を使用して USB kbd /マウスをPS / 2デバイスとしてエミュレートすることで知られています。VGAテキストモードのフレームバッファーにも使用されているのでしょうか。モード設定用のVGA I / Oポートに使用されていると思いますが、テキストフレームバッファがハードウェアでサポートされている可能性があります。ただし、ほとんどのコンピューターはすべての時間をグラフィックスモードで費やしているため、テキストモードのHWサポートを除外することは、ベンダーがしたいことのようです。(OTOH このブログは、自作のVerilog VGAコントローラーがテキストモードをかなり単純に実装できることを示唆しています。)
私は特にIntel SkylakeのiGPUを使用するシステムに興味がありますが、IntelおよびAMDの以前/後期のiGPU、および新旧のディスクリートGPUに興味があります。
(AMDとNVidia以外のベンダーを含みます。PCIeではなくPCIスロットを備えたSkylakeマザーボードがいくつかあります。最新のGPUファームウェアドライバーがテキストモードをエミュレートする場合、ハードウェアVGAテキストモードを備えた古いPCIビデオカードがいくつかあると考えられます。そしておそらくそのようなカードストアをSMIではなくPCIトランザクションにすることができます。)
私のデスクトップは、Asus Z170 Proゲーミングモボのi7-6700kです。アドオンカードはなく、DVI-D出力に1920x1200モニターを備えたiGPUのみです。@EldanがテストしているKaby Lake i5-7300HQシステムの詳細はわかりません。CPUモデルのみです。
私は2011年に
uefiを使用してレガシービデオをエミュレートするフェニックスBIOSの特許US20120159520を見つけました。ビデオハードウェアベンダーにUEFI とネイティブの16ビットリアルモードオプションROMドライバーの両方の提供を要求する代わりに、SMMフックを介してベンダー提供のUEFIビデオドライバーを呼び出すリアルモードVGAドライバー(関数など)を提案します。int 10h
要約
[...]汎用ビデオオプションROMは、汎用ビデオSMMドライバーにビデオサービスの要求を通知します。このような通知は、ソフトウェアシステム管理割り込み(SMI)を使用して実行できます。通知されると、汎用ビデオSMMドライバーは、サードパーティのUEFIビデオドライバーにビデオサービスの要求を通知します。サードパーティのビデオドライバーは、要求されたビデオサービスをオペレーティングシステムに提供します。このようにして、サードパーティのUEFIグラフィックスドライバーは、UEFIディスプレイプロトコルをネイティブでサポートしていないオペレーティングシステムであっても、さまざまなオペレーティングシステムをサポートできます。
説明の多くは、int 10h
すでに明らかにIVTを介してトラップするような呼び出しの処理をカバーしているため、意図的にSMIをトリガーするカスタムコードを簡単に実行できます。関連する部分は、ソフトウェアまたはハードウェアの割り込みをトリガーしないコードでも機能する必要があるテキストモードフレームバッファーへの直接保存について説明している部分です。(そのようなストアでSWをトリガーするHW以外、サポートされている場合は使用できると彼らは言っています。)
テキストバッファのサポート
特定の実施形態では、アプリケーションは、VGAのテキストバッファを直接操作することができる。そのような実施形態では、汎用ビデオSMMドライバ130は、ハードウェアが740KB〜768KBメモリ領域(テキストバッファが配置されている)への読み取り/書き込みアクセス時にSMIトラッピングを提供するかどうかに応じて、2つの方法のうちの1つでこれをサポートする。
SMIトラッピングが利用可能な場合、ハードウェアは、各読み取りまたは書き込みアクセスでSMIを生成する。SMIトラップのトラップアドレスを使用して、正確なテキストの列と行を計算し、仮想テキスト画面の対応する行と列にアクセスできます。
代わりに、この領域では通常のメモリが有効になり、定期的なSMIを使用して、汎用ビデオSMMドライバー130はエミュレートされたハードウェアテキストバッファーの変更をスキャンし、ビデオドライバーによって維持される対応する仮想テキスト画面を更新します。どちらの場合も、変更が検出されると、文字が仮想テキスト画面に再描画されます。
これはBIOSベンダーの特許の1つに過ぎず、ほとんどのハードウェアが実際にどのように機能するか、または他のベンダーが異なることを行っているかどうかはわかりません。それは本質的にことを確認しないいくつかのハードウェアがいますが、その範囲内の店舗にどの缶トラップが存在します。(それが彼らが彼らの特許でカバーすることを決めた仮説的な可能性でない限り)
私が念頭に置いているユースケースでは、画面の更新時にのみトラップする方が、すべてのストアでトラップするよりもはるかに高速なので、どのハードウェア/ファームウェアがどのように機能するか知りたいです。
この質問の動機
第7世代Intel CoreのビデオRAMでインクリメントするASCII 10進カウンターを最適化-ASCIIテキストカウンターの新しい数字をビデオRAMの同じ数バイトに繰り返し保存します。
Linuxの32ビットユーザー空間のコードのバージョンをWBメモリでテストしました。movnti
各ストアの後にCPUがWCバッファーをビデオRAMに同期するさまざまな方法(および場合によってはときどき)タイマー割り込み)。ただし、リアルモードブートローダーの状況がDRAMへの格納だけでなく、SMIをトリガーする場合、これは現実的ではありません。
WBメモリでは、movnti
aを使用したストアのフラッシュは、を使用したフラッシュlock xor byte [esp], 0
よりもいくらか高速ですclflushopt
。しかし、@ Eldanは、MTRRをWCにするようにプログラミングした後、VGAメモリのユーザーに対して速度の向上を報告していません。(また、通常のストアを行う元の速度と同じ速度で、デフォルトでVGAフレームバッファーがUCであることを示します。一部の古いBIOSには、VGAメモリをWCにするオプションがありました USGA = Uncached Speculative Write Combiningと呼ばれる。)
これは実際の問題ではないため、実際の回避策は探していません。ピクセルバイトをVGAグラフィックモードに手動で格納する方がはるかに高速であるかどうかを知ることは興味深いでしょう。
概要
- すべての実際の最新システムは、すべてのストアでSMIをトリガーしてテキストモードのフレームバッファーを作成しますか?
- いいえの場合、WBメモリーのユーザー空間でmovnti +を使用して、WCストア+ clflushをフレームバッファーに近似できますか?したがって、簡単にプロファイリングできます
perf
ため、パフォーマンスカウンターでます。 - 異なるBIOSやハードウェアが異なる戦略を使用している場合、それらの戦略は何ですか?(詳細は必要ありません。「SMIすべてのvblankでVGAフレームバッファーを実際のハードウェアフレームバッファーに同期させる」のような高レベル)
- ハードウェアVGAテキストモードを備えたPCIeまたはPCIビデオカードは、統合されたGPUが実際に実行するものよりも高速でしょうか?実際のPCIe書き込みトランザクションは、ストアがDRAMにヒットするのを待つよりも遅いと思いますが、PCIe書き込みは、すべてのストアでSMIよりも安価です。球場/規模の比較は興味深いでしょう。
これらの質問はすべて関連性が高いですが、期待するほどの重複がない場合は、これを分割することができます。
perf
Linuxがまだブートされていないため、明らかに使用できません。 Linux-CentOS / IntelマシンでのSMI(システム管理割り込み)レイテンシの評価には、SMIのカウント方法に関するいくつかの詳細があります。
MSR_SMI_COUNT=0x34
あるため、最初にカウンターをプログラムする必要のないRDMSRがあります。