1.4 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다.
hello
라는 바이너리 파일은 디스크에 저장되어 있다.
다음의 명령어를 통해 우리는 파일을 실행시킨다.
linux> ./hello
hello world
linux>
shell 은 커맨드라인 인터프리터로 명령어를 입력받고 그 명령을 실행한다.
내장 shell 명령어가 아니라면, 실행파일의 이름으로 판단하여 그 파일을 로딩하여 실행시켜준다.
컴포넌트 간의 정보를 전달한다. word 라는 고정 크기의 바이트 단위로 전송하게 된다.
한 개의 워드가 가지는 바이트 수는 시스템 마다 가지는 기본 시스템 변수이다.
대부분은 4바이트 또는 8바이트를 가진다.
입출력 장치는 외부세계와 시스템 간의 연결을 담당한다. 키보드, 마우스, 디스플레이 등등의 예시가 있다.
입출력 장치는 입출력 버스, 컨트롤러 나 어댑터 를 통해 연결된다.
컨트롤러와 어댑터의 차이는 패키징(packaging) 에 있다.
컨트롤러는 그 자체가 칩셋이거나 머더보드(시스템의 인쇄기판)에 장착되어 있지만,
어댑터는 머더보드에 장착되는 일종의 카드이다.
하지만, 이 둘은 입출력 버스와 입출력 장치간의 정보를 주고받도록 도와준다.
프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치이다.
물리적으로는 DRAM(Dynamic Ramdom Access Memory) 로 구성되어 있다.
논리적으로는 연속적인 바이트들의 배열로 0부터 시작해서 고유의 주소를 가진다.
프로그램을 구성하는 기계어 인스트럭션은 다양한 바이트를 가진다.
데이터 또한 그 타입에 따라 크기가 다양하다. C 언어의 short
, int
, long long
등을 예시로 들 수 있다.
주처리장치(CPU) 라고도 불리는 이 장치는 메인 메모리 에 저장된 명령어를 해독(실행)하는 엔진이다.
중심에는 워드 크기의 저장장치(레지스터) 인 프로그램 카운터(PC) 가 존재한다.
PC 는 기계어 명령어를 가리키고 있다.
프로세서는 전원이 공급되는 순간부터 계속 다음과 같은 행위를 반복한다.
PC가 가르키는 명령어, 즉 인스트럭션은 인스트럭션 집합 구조(Instruction Set Architecture) 로 정의된다.[1]
하나의 인스트럭션은 규칙적으로 실행되며, 여러 단계를 거칠 수도 있다.
업데이트되는 다음의 PC 값은 메모리상 연속일수도, 아닐수도 있다.
프로세서가 실행하는 인스트럭션을 쪼갠 단순한 동작은 메인 메모리, 레지스터 파일, 수식/논리 처리기(ALU) 을 순환한다.
레지스터 파일은 고유의 이름을 갖는 각각의 워드 크기의 레지스터 집합으로 이루어진다.
ALU는 새 데이터와 주소 값을 계산한다.
다음은 단순한 동작의 예시이다.
최신 프로세서는 실행 속도를 위해 복잡한 방식을 사용한다.
이런 점에서 인스트럭션의 효과 와 실제 구현 으로 인스트럭션 집합 구조 와 프로세서의 마이크로구조 를 구별할 수 있다.
hello
프로그램의 실행각 하드웨어 조직에서 조직으로 이동할 때는 bus 통해 이동하게 된다.
bus 간의 중간 역할로 I/O bridge, Bus Interface 등 연결 조직이 존재한다.
즉, 조직에서 조직으로 이동하는 과정에는 bus 가 존재한다고 생각하면 된다.
./hello
입력한다
./hello
라는 문자열이 CPU의 레지스터로 이동한다.
그 후 다시 메인 메모리로 이동한다,
enter 키를 누른다(= 명령 입력이 끝났음을 알린다)
인스트럭션에 따라 hello
실행파일과 "hello world!\n" 을 포함하는 데이터를 디스크에서 메모리로 이동한다.
디스크에서 메모리로 바로 이동하는 것을 직접 메모리 접근(DMA) 라고 한다.
hello
실행파일을 실행한다
메모리의 main 루틴의 기계어를 처리한다.
이는 메모리에 있는 "hello world!\n" 을 레지스터로 가져오고, 다시 출력장치로 보내는 것을 포함한다.
실행 과정을 살펴보며 알 수 있는 점은 단순한 프로그램에도 하드웨어 간의 이동이 굉장히 많다. 라는 것이다.
ISA는 마이크로프로세서가 인식할 수 있는 기계어 명령어들의 집합을 의미하며, CPU 같이 ISA 에 규정된 명령어를 실행하는 물리적 장치를 ISA 의 구현체라고 불린다. wikipedia 참고↩︎