기록공간

컴퓨터 부팅 과정, 프로그램의 동작 원리 본문

Computer Architecture

컴퓨터 부팅 과정, 프로그램의 동작 원리

입코딩 2020. 7. 25. 18:27
반응형

동작 원리


이번에는 응용 소프트웨어, 시스템 소프트웨어, 하드웨어를 아울러 컴퓨터가 켜지고, 프로그램이 실행되는 과정을 정리한다.

 

컴퓨터가 켜지는 과정

CPU는 컴퓨터에 전원이 들어오면 제일 먼저 메모리의 0번지 주소의 데이터를 읽는다. 메모리의 0번지에는 ROM(Read-Only Memory)이라는, 컴퓨터를 구동하기 위한 기본 정보가 담긴 메모리가 있다. ROM은 컴퓨터의 전원을 꺼도 메모리가 지워지지 않아, 컴퓨터가 켜지면 이 곳의 정보를 읽어올 수 있다.

 

따라서 전원이 켜지면 ROM에서 읽어 들인 내용을 바탕으로 하드웨어의 상태를 확인하는 POST(Power On Self Test)를 수행한다. 그리고 운영체제를 로드하기 위해 디스크의 첫번째 섹터인 마스터 부트 레코드(Master Boot Record, MBR)를 읽는다. 이 MBR에서 부트 코드(Boot Code)가 실행된다. 부트 코드는 부팅 가능한 파티션을 찾아 해당 파티션의 부트 레코드(Boot Record)를 호출하고, 해당 파티션 부트 레코드는 RAM에 적재된다. 

 

위의 과정이 모두 끝나면, 부팅이 시작된다.

 

위 그림을 바탕으로 컴퓨터의 부팅 과정을 순서대로 나열해보면 다음과 같다.

  1. 컴퓨터에 전원이 들어오면 POST 과정 수행

  2. 운영체제 로드를 위한 과정 시작

  3. MBR 읽기

  4. MBR의 부트 코드가 실행, 이는 부팅 가능한 파티션을 찾는 역할

  5. 파티션 테이블에서 부팅 가능한 파티션을 찾음 (Partition 1)

  6. 해당 파티션의 첫번째 섹터인 파티션 부트 레코드를 메모리에 적재하여 실행

  7. 해당 파티션으로 부팅이 시작

프로그램이 실행되는 과정

하나의 프로그램은 프로그램이 수행할 다양한 동작을 담은 코드, 즉 명령어들로 이루어져 있다. 아래 그림 Partition1로 부팅된 컴퓨터로 사용자가 Program 0을 실행시키는 경우를 예로 들어, 프로그램이 실행되는 과정을 살펴본다.

 

위 그림은 CPU, 메모리, 디스크 등 전반적으로 나타내고 있다. 프로그램이 실행되는 과정을 상세히 살펴볼 수 있게 CPU 내부를 좀 더 자세히 표현되어 있다.

 

CPU 내부의 구성요소

  • PC (Program Counter) : 다음에 실행할 명령의 메모리 주소를 가리키는 레지스터

    • CPU에 따라 PC를 IP(Instruction Pointer)로 칭하기도 한다.

    • 레지스터 : CPU 내에서 데이터를 저장할 수 있는 아주 빠른 기억 장치, 주로 계산 중인 값을 저장하는 데 사용한다.

  • ALU (Arthmetic / Logic Unit) : 레지스터에 저장된 값을 가지고 산술, 논리 연산을 수행한다.

  • AC (Accumulator) : 산술 연산을 위한 레지스터

  • MAR (Memory Address Register) : Address bus로 향하는, 주소를 저장하는 레지스터

  • Control Unit : 명령이 뜻하는 바에 따라 다른 구성요소들이 할 일을 지시한다.

  • IR (Instruction Register) : 현재 처리중인 명령을 저장

  • MBR (Memory Buffer Register) : Data bus와 연결된, MAR에 저장된 주소에 있는 데이터를 저장하는 레지스터

이 외 레지스터들 : AX, BX, CX, DX, BP, SP, SI, DI, CS, SS, DS, ES, FS, GS, ZF, OF, CF 등

 

System Bus

컴퓨터 내의 다양한 요소들 간의 데이터 전송이 이루어지는 길

  • Address Bus : 주소 전송, CPU -> RAM (단방향)

  • Data Bus : 데이터 전송, CPU -> RAM (단방향)

  • Control Bus : 제어 신호 전송, CPU <-> RAM (양방향)

사용자에 의해 프로그램이 실행되면, 프로그램을 구성하는 명령어와 데이터가 운영체제에 의해 메모리(RAM)에 적재된다. 이렇게 프로그램이 메모리에 적재되어 실행 중인 상태를 프로세스라고 한다.

 

프로그램이 메모리에 적재되면, 해당 프로세스의 주소값이 낮은 곳부터 메모리를 읽어 그곳에 있는 명령을 수행한다. 명령을 수행하는 과정은 크게 fetchexecution으로 구성된다.

 

<Fetch>

  1. 수행할 명령을 가지고 온다. (fetch instruction)

  2. 명령을 해석한다. (decode instruction)

<Execution>

  1. 명령에 필요한 데이터를 가지고 온다. (get data)

  2. 명령을 실행한다. (execute the instruction)

명령의 예시와 이미지를 통해 위의 과정을 살펴보자.

 

0x3333 주소의 명령 1은 주소값이 100인 곳에 들어있는 데이터를 AC 레지스터에 적재하라는 의미라고 가정해보자.

 

적재된 프로세스가 실행될 때, PC는 해당 프로세스에서 제일 처음 실행해야 하는 명령어의 주소를 가리킨다. 위의 예시에서는 제일 처음 실행야 하는 명령이 명령 1이기 때문에, PC가 담긴 주소는 0x3333이 된다.

 

명령 1이 실행되면, 위에서 언급했던 Fetch, Execution 과정이 수행된다.

 

<Fetch>

  1. PC가 가진 주소값 0x3333을 MAR로 전달한다.

  2. PC는 다음 명령의 주소 값을 가리킨다. MAR에 담긴 값 0x3333은 Address Bus를 통해 전달되어 프로세스 메모리 상의 주소 0x3333의 명령을 읽는다.

  3. 주소 0x3333에 있던 명령 LOAD 100은 Control Bus를 통해 MBR로 전달한다.

  4. MBR로 전달된 명령은 IR에 적재된다.

<Execution>

  1. IR에 담긴 명령에서 필요한 데이터가 주소 값 100에 존재하는 데이터이므로, 주소 값 100을 MAR로 전달한다. 

  2. MAR에 담긴 값 100은 Address Bus를 통해 전달되어, 프로세스 메모리 상의 주소 100에 들어있는 값을 읽는다.

  3. 주소 100에 있던 값 24는 Control Bus를 통해 MBR로 전달한다.

  4. MBR로 전달된 값은 AC에 적재된다.

 

명령 1의 수행이 끝나면, 다음 Fetch, Execution 과정이 이어진다. 이 때 PC에 든 값은 그다음 명령인 명령 2를 가리키고 있으니, 결국 프로세스의 명령이 그 순서대로 수행이 되어 프로그램이 전체적으로 동작하는 것이다.

 


레지스터에 대한 이야기


위의 글 내용에서 언급했던 이 외의 레지스터들을 자세하게 살펴보고자 한다.

 

1. 범용 레지스터 : 다양한 용도로 사용되지만 주로 CPU가 사용할 임시 변수를 저장하는 역할을 수행한다.

  • AX (Accumulator) : 산술 연산 수행과 연산 결과 저장에 사용

  • BX (Base) : 데이터에 대한 포인터로 사용

  • CX (Counter) : 반복문이나 문자열의 카운터로 사용

  • DX (Data) : 데이터 저장용으로 사용 

  • SP (Stack Pointer) : 스택의 Top. 가장 최근에 스택에 쌓은 데이터의 위치를 가리킨다.

  • BP (Base Pointer) : 현재 실행 중인 스택 프레임의 시작 주소를 가리킨다.

  • SI (Source Index) : 데이터 연산을 위한 소스 인덱스 또는 입력 데이터 스트림의 위치를 가리킨다.

  • DI (Destination Index) : 데이터 연산의 결과가 저장되는 위치를 가리킴

 

2. 세그멘트 레지스터 : 프로세스의 메모리 영역을 구분하는 역할을 한다.

  • CS (Code Segment) : 코드 영역의 시작 주소를 담고 있다.

  • DS (Data Segment) : 데이터 영역의 시작 주소를 담고 있다.

  • SS (Stack Segment) : 스택 영역의 시작 주소를 담고 있다.

 

3. 기타 레지스터

  • EFLAGS : status, control, system 플래그들을 담고 있는 레지스터

    • Status flag : carry, parity, zero, sign, overflow flag 등

    • Control flag : direction flag

    • System flag : interrupt, trap flag 등

  • IP(Instruction Pointer) : 다음에 실행될 명령의 위치를 가리키는 레지스터

    • CPU에 따라 PC라고 칭하기도 한다.

위에서 언급한 각 레지스터 중, 범용 레지스터는 PC의 역사적 변화에 따라 그 명칭이 바뀌었다. 위에서 정리한 형태는 16bit 시절 형태이며, 현재 32bit 확장에 따라 앞에 E가 붙은 EAX, EBX, ... 의 형태가 사용된다.

 

각 범용 레지스터와 EFLAGS, EIP는 32bit 이며, 세그먼트 레지스터는 16bit이다. 그리고 범용 레지스터는 그 일부만을 칭할 때 다른 명칭이 붙기도 하는데, 그것은 아래 그림과 같다.

 

예를 들면, EAX의 하위 8비트를 AL이라고 표현한다. 이러한 표현은 어셈블리어에서 자주 등장하므로, 알아두면 좋다.


본 내용의 출처는 https://cocojelly.github.io/computer/%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0-(2)/입니다.

반응형

'Computer Architecture' 카테고리의 다른 글

프로세스, 메모리 영역  (0) 2020.07.26
하드웨어와 소프트웨어, 컴퓨터의 성능  (0) 2020.07.24
Comments