CSAPP1. ハロー、worldはどのプロセスに出力しますか?
3443 ワード
CSAPP第1章「パソコンシステムへの旅」の部分を整理しました.第1章なので,後のコンパイル,機械語表現,整数表現など後に学習する内容の導入の感覚が非常に強い.
ディスク上のファイル、メモリ内のプログラム、またはユーザーに関連するコード、およびネットワークを介して交換されるデータは
上のテキストファイルを実行するには、出力するHelloWorldファイルを低レベルのマシン命令に変換する必要があります.
これらの低級な機械言語命令は
コンパイラは、上記の手順を実行して
淡い緑の4段階helloでcファイルをバイナリファイルに変換します.
プリプロセッサ(プリプロセッサフェーズ):#文字で始まるコードに対応するプリプロセッサ(cpp)を処理します.例えば、hello.cは第1行を含み、フロントプロセッサはstdioです.hファイルをこの部分に挿入します.
Complier(コンパイルフェーズ):コンパイラ(CC 1)は前処理フェーズにあります.をiのテキストファイルに変換します.sに変換します.このファイルにはアセンブリ言語のプログラムが含まれています.以下の内容も含めて、今のところ意味が分かりません.
Assembler(コンポーネントステップ):このステップでは、結果をマシン言語に翻訳し、
リンクステップ(Linker):
上で実行されているhello.cファイルは、コンパイルされた独立したオブジェクトファイル
その結果、helloファイルは
テキストファイルをバイナリファイルにコンパイルする過程を見た以上、もっと大きな図を見てみましょう.
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が含まれる.
// 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行
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が含まれる.
Reference
この問題について(CSAPP1. ハロー、worldはどのプロセスに出力しますか?), 我々は、より多くの情報をここで見つけました https://velog.io/@jungbumwoo/helloworld-는-어떤-과정으로-출력될까テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol