23

私はいつもこれを不思議に思っていましたが、まだ答えが見つかりませんでした。「cout」または「printf」を使用するときはいつでも、それは画面にどの程度正確に印刷されますか。テキストはどのように出てきますか...(おそらくここではかなり漠然とした質問ですが、あなたが私に与えたものは何でもうまくいきません)。それで、基本的にそれらの関数はどのように作られていますか?..それはアセンブリですか?もしそうなら、それはどこから始まりますか?。これにより、いったいどのようにしてopenGl/directx関数を作成したかなどの疑問が生じます。

それを分解する人々はそれを分解します。:)

4

5 に答える 5

23

略語を含む1つのシナリオを次に示します。

  1. printfまたはcout、ユーザープログラムのアドレス空間のバッファに文字を入れます。
  2. 最終的に、バッファがいっぱいになるかprintf、バッファを早期に空にするように要求する可能性があります。いずれにせよ、I / Oライブラリはオペレーティングシステムを呼び出し、オペレーティングシステムはバッファの内容を独自のスペースにコピーします。
  3. 出力ファイルが端末にバインドされているとすると、オペレーティングシステムは文字を端末アプリケーションに配信します。
  4. ターミナルアプリは、バッファ内の各文字について、画面にピクセルをペイントする必要があると判断します。
  5. ターミナルアプリはピクセルペイントの指示を設定し、ウィンドウマネージャーに代わってこれを行うように要求します。(最近のUnixでは、これは通常Xサーバーです。)
  6. ウィンドウマネージャーはピクセルを取得します。ウィンドウが実際に画面に表示されている場合、ウィンドウマネージャーは、表示されているピクセルを保持するバッファー(フレームバッファーと呼ばれる)を更新します。次に、ウィンドウマネージャーがオペレーティングシステムに通知する場合があります。ウィンドウマネージャーがオペレーティングシステムと連携していて、同じメモリを共有している可能性があります。
  7. 次に画面が更新されると、ハードウェアはフレームバッファ内の新しいビットを認識し、画面のペイントが異なります。
  8. Voilà!画面に文字が表示されています。

クマが踊るのはすごい。

于 2010-03-30T02:39:14.740 に答える
19
于 2010-03-30T03:42:03.540 に答える
2

さて、彼らは一連のライブラリ関数を通過し、最終的にはwrite()システムコールを呼び出し、データを適切なファイル記述子に送信します。これにより、ターミナルエミュレータでread()呼び出しが発生します。 (または、これがWindowsの場合は、コマンドウィンドウシェル)。ターミナル/シェルにより、そのデータが画面に描画されます。おそらく、グラフィックシステムにデータを送信するためのシステムコールがさらに多くなります。

WindowsとUnix/Linuxの用語はまったく異なります。特に、シェルの概念はそれぞれでまったく同じではありません。ただし、read()呼び出しとwrite()呼び出しの使用は、どちらの場合も非常に似ています。

システムコールは、カーネルに特定のことを行わせる特別な関数です。それらがどのように実装されるかはかなり魔法のようであり、使用しているプロセッサの種類に大きく依存しますが、通常、カーネルが整理しなければならない何らかの回復可能なプロセッサエラーを引き起こすことによって発生します。

于 2010-03-30T02:00:09.873 に答える
0

魔法は実際にデバイスドライバで発生します。OSは、アプリケーションプログラマーが接続するためのインターフェイスを提供します。これはある程度マッサージされ(たとえばバッファリングされ)、デバイスに送信されます。次に、デバイスは共通の表現を取得し、それを特定のデバイスが理解できる信号に変換します。そのため、ASCIIは、コンソール、PDFファイル、プリンター、またはディスクに、そのデバイスに適した形式で適切な形式で表示されます。ドライバーが理解できないASCII(またはUTF8)以外のものを試してみてください。そうすれば、私が話していることがわかります。

OSが処理できないもの(たとえば、特別なグラフィックカード)の場合、アプリはデータをデバイスメモリに直接書き込みます。これは、DirectXのようなものがどのように機能するかです(大幅に単純化しすぎます)。

各デバイスドライバーは異なります。ただし、少なくともデバイスのクラス(ディスク、NIC、キーボードなど)ごとに、OSとのインターフェイス方法はそれぞれ同じです。

于 2010-03-30T02:50:02.007 に答える
0

ソースをクラックしてglibcに開き、自分の目で確かめてください。

簡単な答え、たくさんのCコード、アセンブラーが時々散りばめられています。

于 2010-03-30T01:32:15.127 に答える