CSAPP1. ハロー、worldはどのプロセスに出力しますか?


CSAPP第1章「パソコンシステムへの旅」の部分を整理しました.第1章なので,後のコンパイル,機械語表現,整数表現など後に学習する内容の導入の感覚が非常に強い.
// hello.c
#include <stdio.h>

int main()
{
	printf("hello, world\n");
    	return 0;
}
上のhello.cファイルは、text filesと呼ばれ、他のファイルはbinary filesに分類されます.
ディスク上のファイル、メモリ内のプログラム、またはユーザーに関連するコード、およびネットワークを介して交換されるデータはbunch of bitsです.01101010010010と同じ数字ですが、同じ数字でもどのcontextで読むかによって意味が異なります.整数、浮動小数点数、characer string、またはマシン命令に依存する特定の数値があります.
上のテキストファイルを実行するには、出力するHelloWorldファイルを低レベルのマシン命令に変換する必要があります.
これらの低級な機械言語命令はexecutable object programの形式で統合され、バイナリ形式で格納される.
コンパイラは、上記の手順を実行してsourceファイルをobjectファイルに変換します.手順を下図に示します.

淡い緑の4段階helloでcファイルをバイナリファイルに変換します.

  • プリプロセッサ(プリプロセッサフェーズ):#文字で始まるコードに対応するプリプロセッサ(cpp)を処理します.例えば、hello.cは第1行を含み、フロントプロセッサはstdioです.hファイルをこの部分に挿入します.

  • Complier(コンパイルフェーズ):コンパイラ(CC 1)は前処理フェーズにあります.をiのテキストファイルに変換します.sに変換します.このファイルにはアセンブリ言語のプログラムが含まれています.以下の内容も含めて、今のところ意味が分かりません.
  • main:
    	subq	$8, %rsp
        movl	$.LCO, %edi
        call	puts
        movl	$0, %eax
        addq	$8, %rsp
        ret
        

  • Assembler(コンポーネントステップ):このステップでは、結果をマシン言語に翻訳し、relocatable object programという形式でhello.oというファイルに組み合わせて結果を保存します.このファイルは、main関数の構造を符号化するための17バイトを含むバイナリファイルです.hello.oファイルから、読めないデータのイメージが形成されています.

  • リンクステップ(Linker):
    上で実行されているhello.cファイルは、コンパイルされた独立したオブジェクトファイルprintfに位置するprintf.o関数を呼び出す.本ファイルはhello.oファイルと結合し、Linkerプログラムによって統合作業を実行しなければならない.
    その結果、helloファイルはexecutable object fileであり、メモリにバイナリ形式でロードされます.
  • テキストファイルをバイナリファイルにコンパイルする過程を見た以上、もっと大きな図を見てみましょう.


    cpuは実行する必要がある命令を実行し、hello入力を待つ.ユーザーは「hello」と入力し、各文字をレジスタに読み込み、メモリに保存します.
    Enterをクリックすると、Shellは実行ファイルhelloをディスクからメインメモリにロードします.このプロセスでは、いつコンパイルするか、ディスクにテキストファイルが格納されているのか、バイナリファイルが格納されているのか分かりません.
    この場合、メモリにロードするプロセスは、DMAによってディスクからプライマリメモリに直接移動します.

    hello objectファイルがメモリにロードされると、cpuはhelloプログラムのメインルーチンを実行するマシン命令を実行し、これらの命令は「hello,worldn」文字列をメモリからレジスタファイルにコピーし、表示装置に送信する.
    また、
    cpuについてもう少し話しましょう
    cpuコアにはword-sizeというProgram Counter(PC)というストレージデバイス(register)があり、常にcpuが実行するマシンレベルの命令が存在するメモリのアドレスを指す.cpuは、命令を読み出し、構築されたビットを解釈して実行し、pcを命令が存在する位置に更新する.これらのプロセスは、メインメモリレジスタ−ALU上で実行される.
    CPUで実行される動作には、Load、Store、Openrate、Jumpが含まれる.