また、標準出力はまさにそれです。「画面」の概念は、OS の抽象化です。たとえば、Linux やその他の UNIX では、プロセスは TTY または PTY (teletypewriter および psudoteletypewriter) に関連付けられています。これは、stdout が指すことができる場所ですが、そうである必要はありません。Stdout は、ファイル、ネットワーク、その他何でも指定できます。そして、真の端末 (Ubuntu の Ctrl-Alt-F1 を考えてください) と疑似端末 (Konsole、CMD、Terminal.app を考えてください) を区別する必要があります。疑似端末がある場合、それはウィンドウ内に存在するため、事態は 10 倍複雑になります。疑似端末をお持ちの場合、手順は次のとおりです (Linux):
- システムコール (
write
) を作成して、FD 0 に文字列を書き込みます。
write
は、おそらく PTY のスレーブ コントローラに接続されている FD 0 に関連付けられたファイルに書き込みます。次に、ターミナル エミュレータ (マスター コントローラ) が出力を受け取ります。
- 何らかのグラフィック ライブラリ (GTK、Qt、SDL、OpenGL など) を使用して、ウィンドウ バッファーにレンダリングします。これは、フォントの空想が起こる場所です。
- ウィンドウ バッファーは、ウィンドウ マネージャーと 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 ポートは、ドライバーが関与する場所です。どのポートと何を書き込むかはグラフィックス カードに依存するため、例を挙げませんが、調べることができます。