내 마음대로 컴퓨터 구조 정리하기 (2)


주제 - “컴퓨터 구조(2)”

부제 - 컴퓨터 부팅 과정, 프로그램의 동작 원리 살펴보기

참고 서적





2. 동작 원리를 살펴보기


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



2-1. 컴퓨터가 켜지는 과정


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

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

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


image


위의 그림과 함께 컴퓨터의 부팅과정을 순서대로 정리하면 아래와 같습니다.

  1. 컴퓨터에 전원이 들어오면 POST 과정 수행
  2. 운영체제 로드를 위한 과정 시작
  3. MBR 읽기
  4. MBR의 부트 코드가 실행, 이는 부팅 가능한 파티션을 찾는 역할
  5. 파티션 테이블에서 부팅 가능한 파티션을 찾음 (그림에서는 Partition1)
  6. 해당 파티션의 첫번째 섹터인 파티션 부트 레코드를 메모리에 적재하여 실행
  7. 해당 파티션으로 부팅이 시작됨



2-2. 프로그램이 실행되는 과정


하나의 프로그램은 프로그램이 수행할 다양한 동작을 담은 코드, 즉 명령어들로 이루어져 있습니다. 아래에서는 Partition1로 부팅된 컴퓨터로 사용자가 Program0을 실행시키는 경우를 예로 하여, 프로그램이 실행되는 과정을 보겠습니다.

아래는 CPU, 메모리, 디스크를 전체적으로 나타낸 이미지로, 프로그램이 실행되는 과정을 상세히 살펴보기 위해 CPU 내부를 좀 더 자세히 표현하였습니다.

image

[CPU 내부의 구성요소]

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

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

  • 레지스터 : CPU 내에서 데이터를 저장할 수 있는 아주 빠른 기억 장치

​ 주로 계산 중인 값을 저장하는데 사용

ALU (Arithmetic / 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 단방향


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

image


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

<fetch>

  1. 수행할 명령을 가지고 옴 (fetch instruction)
  2. 명령을 해석 (decode instruction)

<execution>

  1. 명령에 필요한 데이터를 가지고 옴 (get data)
  2. 명령을 실행 (execute the instruction)


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

image

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에 적재됨

image

<execution>

  1. IR에 담긴 명령에서 필요한 데이터가 주소값 100에 존재하는 데이터이므로, 주소값 100을 MAR로 전달
  2. MAR에 담긴 값 100은 address bus를 통해 전달되어, 프로세스 메모리 상의 주소 100에 들어있는 값을 읽음
  3. 주소 100에 있던 값 24는 control bus를 통해 MBR로 전달
  4. MBR로 전달된 값은 AC에 적재됨

image


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



이번 정리는 CPU 위주로 프로그램이 동작하는 과정을 다루었습니다. 다음 정리는 3. 프로세스의 메모리 공간 파헤치기로, 프로그램이 동작할 때 메모리 쪽의 내용을 다룰 예정입니다.





레지스터에 대한 이야기


위의 글 내용에서 이 외의 레지스터들로만 언급이 되고 넘겼던 레지스터들에 대해 정리를 해보고자 합니다.

  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 (Program Counter) 라고 칭하기도 함


위에서 언급한 각 레지스터 중, 범용 레지스터는 PC의 역사적 변화에 따라 그 명칭이 바뀌었습니다. 제가 위에서 정리한 형태는 16bit 시절에 불렸던 형태이며, 현재는 32bit로의 확장에 따라 앞에 E가 붙은 EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI, EIP 의 형태가 사용됩니다.

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

image

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





이전 - 내 마음대로 컴퓨터 구조 정리하기 (1)

이어서 - 내 마음대로 컴퓨터 구조 정리하기 (3)

comments powered by Disqus