2

入門コースで最初に学ぶことは、System.out.println、printf などが標準出力に出力され、画面にポップアップ表示されることです。そのプロセスの詳細な手順をすべて知りたいです。要するに、次のことが関係していることは知っていますが、すべての詳細はわかりません。

  • カーネルに対してシステムコールが行われる
  • テキストはラスタライズされます
  • CPUはプログラム命令を実行します(共有ライブラリを使用していますよね?)
  • 画面のドライバーが関与しています
  • CPUはマザーボード上のバス(PCI? または PCIe?) と通信します。
  • バスはデータを画面に送信します

私が持っているいくつかの具体的な質問は次のとおりです。

  • コンピュータは、標準出力が画面に表示されることをどのように認識していますか? 複数の画面が接続されている場合はどうなりますか? ハードドライブまたはイーサネットジャックからの画面をどのように認識しますか?
  • ビデオドライバーはどのように方程式に関与しますか? 使用するドライバーをどのように認識しますか?
  • CPU はどのようにバスにデータを配置しますか? たとえば、どのアドレスに書き込むかをどのように知るのでしょうか? そのアドレスは、データを書き込み場所に送信するためにどのように使用されますか? このプロセスで使用される CPU 命令の例を教えてください。

ありがとう!

4

1 に答える 1

2

また、標準出力はまさにそれです。「画面」の概念は、OS の抽象化です。たとえば、Linux やその他の UNIX では、プロセスは TTY または PTY (teletypewriter および psudoteletypewriter) に関連付けられています。これは、stdout が指すことができる場所ですが、そうである必要はありません。Stdout は、ファイル、ネットワーク、その他何でも指定できます。そして、真の端末 (Ubuntu の Ctrl-Alt-F1 を考えてください) と疑似端末 (Konsole、CMD、Terminal.app を考えてください) を区別する必要があります。疑似端末がある場合、それはウィンドウ内に存在するため、事態は 10 倍複雑になります。疑似端末をお持ちの場合、手順は次のとおりです (Linux):

  1. システムコール ( write) を作成して、FD 0 に文字列を書き込みます。
  2. writeは、おそらく PTY のスレーブ コントローラに接続されている FD 0 に関連付けられたファイルに書き込みます。次に、ターミナル エミュレータ (マスター コントローラ) が出力を受け取ります。
  3. 何らかのグラフィック ライブラリ (GTK、Qt、SDL、OpenGL など) を使用して、ウィンドウ バッファーにレンダリングします。これは、フォントの空想が起こる場所です。
  4. ウィンドウ バッファーは、ウィンドウ マネージャーと X ウィンドウ システムに渡され、他のすべてのウィンドウと一緒に描画されます。

ビデオ ドライバーに関しては、ビデオ ドライバーはこのシステムの 2 つの部分 (X ウィンドウと OpenGL) で使用されます。ビデオ ドライバーは、構成ファイルとハードウェア検出によって設定されます。この場合、OS (または BIOS) がシステムを調べて、使用可能なすべてのハードウェアを検出し、ドライバーをロードします。

CPU はどのようにバスにデータを配置しますか? (以下は、私の知る限り、x86 および Linux 固有のものです)。データは何らかの方法でグラフィックス カードに到達する必要があります。それはいくつかの方法で発生する可能性があります。ビデオ カードが一部のビデオ メモリを CPU メモリにマップするか、x86 I/O ポートを使用します (inおよびout命令)。

最初の状況を見てみましょう。すべてのビデオ カードは、テキスト ビデオ バッファをセグメント アドレス 0xb800 にマップします (また、ある種の 3D データ バッファをどこかにマップするものもありますが、よくわかりません)。したがって、文字列をビデオ バッファーに書き込みたい場合は、次"Hello, world"の x86 ASM を使用します。

mov es, B800H ;Set the extra segment to the video buffer
mov ds, cs ;Set the data segment
mov esi, hellomsg ;Set the source index to the hellomsg
mov edi, 0 ;Video buffer offset
mov ecx, [hellolen] ;How many characters
rep movsb ;Copy

;;Data
hellomsg db "Hello, world!" ;Null terminated hello world
hellolen dw 13

ちなみに、これはドライバーまたは OS レベルの ASM です。ビデオ バッファーに直接アクセスするか、少なくともビデオ バッファーをアドレス空間にマップする必要があります。もう 1 つのオプションである I/O ポートは、ドライバーが関与する場所です。どのポートと何を書き込むかはグラフィックス カードに依存するため、例を挙げませんが、調べることができます。

于 2012-08-31T06:04:10.060 に答える