hello.c 소스 프로그램은 컴파일 시스템에 의해 hello라는 실행가능한 목적파일로 번역되어 디스크에 저장되었다.
linux> ./hello
hello, world
linux>
만약, 명령어 라인이 내장 쉘 명령어가 아니라면 쉘은 실행파일의 이름으로 판단하고 그 파일을 로딩해서 실행시켜 준다.
이후, 쉘은 해당 파일을 실행하고 hello파일은 메시지를 화면에 출력하고 종료한다.
hello 프로그램을 실행할 때 무슨 일이 일어나는지 설명하기 위해서는 아래 그림과 같은 시스템에서의 하드웨어 조직을 이해할 필요가 있다.
시스템 내를 관통하는 전기적 배선군을 버스(bus) 라고 하며, 컴포넌트들 간에 바이트 정보들을 전송하는데 일반적으로 워드(word) 라고 하는 고정 크긱의 바이트 단위로 데이터를 전송하도록 설계된다.
한 개의 워들 구성하는 바이트 수는 시스템마다 보유하는 기본 시스템 변수로 대부분의 컴퓨터들은 4바이트(32비트) 또는 8바이트(64비트)의 크기글 갖는다.
시스템과 외부 세계와의 연결을 담당하는 장치로 예제 시스템은 입력장치인 키보드와 마우스, 출력용 디스플레이, 데이터와 프로그램의 장기 저장을 위한 디스크 드라이브 총 네 개의 입출력 장치를 가지고 있다.
각 입출력 장치는 입출력 버스와 컨트롤러나 어댑터를 통해 연결되는데 이들 각각의 목적은 입출력 버스와 입출력 장치들 간에 정보를 주고받기 위함이지만, 두 장치의 차이는 패키징에 있다.
프로세서가 프로그램을 실해나는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치이다.
물리적으로 메인 메모리는 DRAM(Dynamic random access Memory) 칩으로 구성되어 있으며, 논리적으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있다.
주처리장치 또는 간단히 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독(실행) 하는 엔진이다.
중심에는 워드 크기의 저장장치(또는 레지스터)인 프로그램 카운터(PC)가 존재하는데 어느 한순간에 PC는 메인 메모리의 기계어 인스트럭션을 가리킨다.
전원이 공급되고 끊어질 때까지 프로세서는 PC가 가리키는 곳의 인스트럭션을 반복적으로 실행하고 PC값이 다음 인스트럭션의 위치를 가리키도록 업데이트 한다.
이 새로운 위치는 방금 수행한 인스트럭션과 메모리 상에서 연속적일 수도 있고, 그렇지 않을 수도 있다.
인스트럭션 요청에 의해 CPU가 실행하는 작업의 순서
지금까지 시스템 하드웨어 조직과 동작에 대한 간단한 이해를 바탕으로 예제 프로그램이 실행될 때 무슨 일이 일어나는지 이해할 수 있었고 아래는 실행 과정이다.
":\hello"를 입력하면 쉘 프로그램은 각각의 문자를 레지스터에 읽어들인 후, 메모리에 저장한다.
키보드에서 엔터를 누르면 쉘은 명령 입력을 끝마쳤다는 것을 알고 파일 내의 코드와 데이터를 복사하는 일련의 명령어를 실행하여 실행파일 hello를 디스크에서 메인 메모리로 로딩한다.
데이터 부분은 최종적으로 출력되는 문자 스트링인 "hello, world\n"을 포함한다. 직접 메모리 접근(DMA)이라고 알려진 기법을 이용해서 데이터는 프로세서를 거치지 않고 디스크에서 메인 메모리로 직접 이동한다.
일단 hello 목적 파일의 코드와 데이터가 메모리에 적재된 후, 그림과 같이 프로세서는 hello 프로그램의 main 루틴의 기계어 명령어를 실행하기 시작한다.
이 명령어들은 "hello, world\n" 문자열을 메모리로부터 레지스터 파일로 복사하고, 거기로부터 디스플레이 장치로 전송하여 화면에 글자들이 표시된다.
Bryant O'Hallaron 컴퓨터 시스템(제 3판)