LISTORY

[윈도우즈 시스템 프로그래밍] 프로그램의 실행과정/하드웨어 구성의 재접근 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 프로그램의 실행과정/하드웨어 구성의 재접근

LiStoryTeller 2018. 5. 12. 18:28


저번 포스팅에 이어 뇌를 자극하는 윈도우즈 시스템 프로그래밍 유투브 강의에 대한 정리이다.


 YouTube 주소 ⊙ ☞ 1장. 프로그램의 실행과정/하드웨어 구성의 재접근




프로그램의 실행 과정/하드웨어 구성의 재접근


1장 두번째 강의이다.


프로그램의 실행 과정


실행파일이 생성되는 과정


 전처리기->컴파일러->어셈블러->링커



※ CPU 디자인


저번 포스팅에서 CPU의 컨트롤 유닛은 명령어를 해석한다고 설명해 두었다.


하지만 컨트롤 유닛은 어떻게 명령어에 대해 알고 명령어를 해석할 수 있을까??


이는 CPU를 디자인하는 과정에서 명령어를 어떻게 가져가야 하나 디자인하기 때문이다.


명령어를 어떻게 디자인하냐에 따라 CPU를 달리 디자인한다. 즉, 명령어는 CPU 디자인에 있어 상당히 중요한 의미를 지닌다.


명령어를 디자인하고, 후에 CPU에 명령어가 들어갔을 때 저번에 말한 컨트롤 유닛이 디자인에 맞게 명령어를 해석하고 실행한다.


명령어는 숫자로 이루어지는데, 이렇게 하면 개발자가 명령어를 이해하는 것이 쉽지 않다.


그래서 명령어에 문자로된 명령어(ADD, MOV...)를 붙여주고 개발자는 이를 이용할 수 있게 하였다.


이러한 명령어를 이용하여 프로그래밍 하는 것을 어셈블리 프로그래밍이라 한다.


이러한 명령어, 즉 문자로 된 명령어는 컴퓨터가 이해하지 못하는 언어이다. 이를 다시 컴퓨터가 이해하는 언어로 변환해주어야 하는데 이러한 역할을 하는 것을 어셈블러라고 한다.



※ 전처리기에 의한 치환작업
#으로 시작하는 지시자(#include, #define...) 등을 변환



앞서 말한 어셈블리 프로그래밍도 사실 프로그래밍하기에 좋지는 않다(사람이 쉽게 이해할 수 없기에...)

이러한 점을 극복하기 위해 프로그래밍 언어가 등장하게 되었다.

그렇다면 프로그래밍 언어를 어셈블리어로 변환시켜 주는 역할이 필요한데, 이런 부분을 수행하는 것이 컴파일러이다.

즉 실행파일이 생성되는 과정에사 전처리기, 컴파일러, 어셈블러의 역할은 컴퓨터가 이해할 수 있는 언어로 변환시켜 주는 것이다.

반면 링커가 하는 역할은 라이브러리와의 결합이다. 어셈블러를 통해 만들어지는 바이너리와 라이브러리를 묶어 하나의 실행 파일을 만드는 것이다.

이제 명령어 관점에서 CPU를 봐보자


◎ Stored Program Concept

프로그램은 메모리에 저장되어야 한다는 컨셉으로 컴퓨터 구조가 디자인되어야 한다는 것이다.

이는 오늘날 컴퓨터의 큰 틀이고, 폰노이만 아키텍처라고도 불리운다.

간단히 설명하자면 명령어는 메모리에 저장이 되어 CPU에 의해 Fetch, Decode, Execution 되어야 한다는 개념이다.

메모리에 저장된 명령어를 하나씩 CPU로 가져가서(Fetch) 명령어를 해석(Decode)하고 실행(Execution)되어야 한다는 것이다.

연산은 보통 ALU가 중심이 되어 Execution된다.

이 과정을 크게 다시 설명해보겠다.

앞서 말한 전처리기, 컴파일러, 어셈블러, 링커 등의 과정을 거쳐 실행 파일이 생성된다.

이렇게 생성된 시랭 파일은 메모리에 로드되게 되고, 실행파일을 구성하는 명령어 하나하나를 CPU에 Fetch 한다.

CPU에 Fetch된 명령어는 레지스터에 저장되고, 컨트롤 유닛이 레지스터에 저장된 명령어를 가져와 Decode한다.

해석한 명령어는 ALU에 의해 Execution된다. 


◎ 데이터 이동의 기반 버스 시스템

CPU와 메모리 관점에서의 버스...

버스는 일반적으로 데이터 버스, 어드레스 버스, 컨트롤 버스 이렇게 세가지로 나뉜다.

데이터 버스는 당연히 데이터를 이동하는 것이고, 데이터 주소를 이동하는 것이 어드레스 버스이다.

버스는 기본적으로 양방향 통신이다. 데이터는 CPU에서 메모리로 갈 수도 있지만 메모리에서 CPU로 올 수도 있다.

그렇다면 지금 데이터를 보내도 되는지 확인하는 것이 필요한데 이런 역할을 하는 것이 컨트롤 버스이다.

또한 컨트롤 버스를 통해 지금 데이터를 보낸다는 신호를 보낼 수도 있다.






Comments