[밑바닥부터 만드는 컴퓨팅] 05장 컴퓨터 아키텍쳐

7 minute read

개요

해당 내용은 ‘밑바닥부터 만드는 컴퓨팅 시스템’ 책의 5장 내용을 정리하였습니다.

1. 배경

1.1 내장식 프로그램 개념

컴퓨터는 정해진 명령어 집합들을 실행하는 고정된 하드웨어 플랫폼에 기반합니다. 동시에 컴퓨터가 실행하는 명령어들은 기본 블록이 되어 무한히 복잡한 프로그램으로 조합됩니다. 이러한 프로그램들은 하드웨어에 내장되지 않고 컴퓨터의 메모리상에 데이터처럼 저장되고 연산되는데, 이를 소프트웨어라고 부릅니다. 사용자가 현재 실행하는 소프트웨어에 따라 연산이 달라지므로, 같은 하드웨어라고 하더라도 어떤 프로그램을 실행하느냐에 따라 제각각의 일을 수행할 수 있습니다.

1.2 폰 노이만 구조

폰 노이만 기계는 현대의 거의 모든 컴퓨터 플랫폼의 개념적 설계도이자 실제 구조이기도 합니다.

image

폰 노이만 구조는 중앙 처리 장치를 기반으로 하며, 이 장치는 메모리 장치와 통신하고, 입력 장치에서 데이터를 받고, 출력 장치에 데이터를 보내는 일을 합니다. 이 구조의 중심에 내장식 프로그램의 개념이 있습니다. 즉 메모리는 컴퓨터가 조작하는 데이터 뿐만 아니라, 컴퓨터가 수행하는 명령어도 저장합니다.

1.3 메모리

폰 노이만 기계의 메모리는 데이터와 명령어, 두 종류의 정보를 저장합니다. 이 두 정보는 보통 다르게 취급되며, 일부 컴퓨터에서는 메모리 장치를 분리해서 따로 저장하기도 합니다. 두 정보의 기능은 다르지만, RAM에 2진수로 저장된다는 점은 같습니다. 이 구조는 word나 loaction이라 불리는 정해진 크기의 셀들이 배열된 것으로 유일한 주소를 가집니다.

1.3.1 데이터 메모리

고수준 프로그램은 변수, 배열, 객체같은 추상적 개념들을 다룹니다. 이런 추상적 데이터들은 기계어로 번역하면 2진 숫자열로 바뀌어 데이터 메모리에 저장됩니다. 주소를 통해 데이터 메모리에서 한 word를 선택하면, 그 word에 읽거나 쓰는게 가능해집니다. 읽기의 경우 word의 값을 가져오며, 쓰기의 경우 word의 위치에 새로운 값을 덮어씌웁니다.

1.3.2 명령어 메모리

고수준 명령어들을 기계어로 변역하면 2진수 기계어를 뜻하는 word가 됩니다. 이 명령어들은 메모리에 저장됩니다. 컴퓨터 연산의 각 단계마다 CPU는 명령어 메모리에서 하나의 word를 인출(fetch)하여 해석한 뒤 정해진 명령어를 수행하고, 다음 수행할 명령어를 찾아냅니다. 그래서 명령어 메모리의 내용을 바꾸면 컴펴튜 연산이 완전히 바뀌게 됩니다.

명령어 메모리에 상주하는 명령어는 기계어라 불리는 미리 정의된 형식으로 작성됩니다. 어떤 컴퓨터에서는 연산과 피연산자를 나타내는 코드가 한 word로 표현되는 반면 어떠한 컴퓨터는 여러 word로 쪼개져 기술되기도 합니다.

1.4 중앙 처리 장치

중앙 처리 장치(CPU)는 불러온 프로그램의 명령어를 실행하는 일을 담당합니다. CPU는 이 명령어들을 이용해 다양한 계산을 수행하고, 메모리의 값을 읽거나 쓰며, 조건에 따라 다른 명령어로 점프합니다. CPU는 이러한 작업을 수행할 때 산술 논리 연산장치(ALU), 레지스터, 제어장치 세가지의 주요 하드웨어가 관여합니다.

1.4.1 산술 논리 연산 장치 (ALU)

ALU는 컴퓨터에서 지원하는 모든 저수준 산술 연신 및 논리 연산을 수행하는 장치입니다. 앞에서 실습한 바와 같이 두 값을 더하거나, 비트 조작 등의 연산을 수행합니다.

1.4.2 레지스터

CPU는 간단한 계산을 빠르게 수행하도록 설계됩니다. 계산 성능을 올리려면 이런 계산의 결과를 매번 메모리에 로드하고 저장하기보다는, CPU 근처에 저장할 필요가 있습니다. 이러한 이유로 모든 CPU는 word를 저장할 수 있는 고속 레지스터를 가지고 있습니다.

1.4.3 제어 장치

요즘의 컴퓨터 명령어는 보통 폭이 32비트 또는 64비트인 2진 코드로 표현됩니다. 이러한 명령어 하나가 실행되려면 명령어를 해석해서 다양한 하드웨어 장치가 명령어를 어떻게 실행해야 하는지 정보를 알아내고 각각에 전달해야 합니다. 명령어 해석은 제어 장치에서 이뤄지며, 동시에 이 장차는 어떤 명령어를 인출하고 다음에 실행해야 하는지 알아내는 역할도 합니다.

CPU 연산은 이제 명령어를 메모리에서 인출하고, 해석하고, 실행하고, 다음 명령어를 인출하는 루프가 반복되는 것을 알 수 있습니다. 명령어가 실행될 때는 ALU에서 어떤 값을 계산하고, 내부 레지스터를 조작하고, 메모리에서 word 하나를 읽고, 메모리에 단어 하나를 쓰는 작업들 중 하나 이상을 하게 됩니다. CPU는 이 작업을 실행하는 과정에서 다음에 인출하고 실행할 명령어를 찾는 작업도 합니다.

1.5 레지스터

메모리 접근 작업은 컴퓨터의 입장에서는 느린 작업입니다. CPU가 메모리 주소 j의 내용을 가져오는 과정은 다음과 같습니다.

  1. j가 CPU에서 RAM으로 전달됨
  2. RAM의 직접 접근 논리에 따라 주소가 j인 메모리 레지스터가 선택됨
  3. RAM[j]의 내용이 CPU로 전달됨

레지스터는 데이터 추출 및 저장 기능이 RAM과 동일하지만, 데이터가 옮겨지거나 메모리를 탐색하는 비용이 들지 않습니다. 그 이유로 첫번째는 CPU칩 내부에 물리적으로 위치하여 바로 접근이 가능하고, 두번째로는 메모리 셀은 수백만개가 있는 반면 레지스터는 소수만 있기 때문입니다. 따라서 조작할 레지스터를 지정하는데 몇 개의 비트만 사용하므로 명령어 길이도 더 짧게 됩니다.

CPU들은 다양한 종류의 레지스터를 각각 다른 개수만큼 사용합니다. 어떤 컴퓨터 아키텍쳐에서는 다음과 같은 레지스터가 하나 이상의 기능을 수행합니다.

1.5.1 데이터 레지스터

이 레지스터들은 CPU의 단기 기억 메모리 기능을 합니다. 예를 들어 (a-b)*c 값을 계산한다고 할 때, 먼저 (a-b) 의 값을 계산하고 기억하애 합니다. 이 중간 값을 메모리에 저장하는 것 보다 금방 사용할 것이기 때문에 내부에 저장하는 것이 더 좋습니다. 이러한 용도로 데이터 레지스터를 사용합니다.

요약하자면 데이터 레지스터는 어떠한 연산을 수행하였을 때의 결과값을 저장하는 레지스터입니다.

1.5.2 주소 지정 레지스터

CPU는 데이터를 읽고 쓰기 위해 계속해서 메모리에 접근해야 합니다. 그리고 이러한 연산을 하게되면 접근해야 할 메모리 워드를 지정해야 합니다.

주소가 현재 명령어에 포함될 수도 있고, 예전 명령어의 실행 결과를 이용하기도 합니다. 이 중 후자의 경우 주소가 될 값을 저장하는데, 이때 주소 지정 레지스터가 사용됩니다.

요약하자면 주소 지정 레지스터는 어떠한 메모리에 접근하기 위한 주소값을 저장하는 레지스터입니다.

1.5.3 프로그램 계수기 레지스터

프로그램을 실행할 때 CPU 명령어 메모리에서 인출해야 할 다음 명령어의 주소를 항상 알고 있어야 합니다. 이 주소는 PC(program counter)라 불리는 레지스터가 저장하고 있습니다. 그리고 PC의 값은 명령어 메모리에서 인출할 명령어의 주소로 쓰입니다.

PC는 명령어를 수행한 뒤 다음 명령어를 가르키도록 일정하게 증가하며, 명령어의 수행 결과로 메모리 주소가 jump 하는 경우에 PC에 해당 주소를 저장하여 해당 메모리의 명령어를 수행하도록 하게 됩니다.

요약하자면 PC 레지스터는 CPU가 수행하기 위한 명령어 주소를 저장하는 레지스터입니다.

1.6 입력과 출력

컴퓨터는 다양한 입력 / 출력 장치를 통해 외부 환경과 통신합니다.

입력장치는 컴퓨터에 신호를 입력할 수 있는 장치로 키보드, 마우스, 스캐너 등이 있습니다. 출력장치로는 모니터, 프린터 등이 있습니다.

이러한 입출력 장치를 처리하는 기법 중 가장 간단한 기법은 메모리 매핑 입니다. 기본적인 아이디어는 입출력 장치를 에뮬레이션하여 CPU에게 마치 일반적인 메모리에 접근하는것처럼 보이도록 하는 방법입니다. 구체적으로는 각 입출력 장치마다 메모리 내에 전용 영역이 할당됩니다. 키보드, 마우스와 같은 입력장치의 경우 할당된 메모리 영역에 입력값을 지속적으로 읽어 반영하도록 되어있습니다. 출력 장치의 경우 특정 메모리의 값을 지속적으로 읽어들여 물리적 장치에 구동하도록 만들어집니다.

2. 핵 하드웨어 플랫폼 명세

2.1 개요

핵 플랫폼은 16비트 폰 노이만 기계로, CPU와 명령어 메모리 및 데이터 메모리로 분리된 메모리 모듈, 두 개의 메모리 매핑 I/O 장치인 스크린과 키보드로 구성되어 있습니다.

핵 컴퓨터는 명령어 메모리에 있는 프로그램을 실행합니다. 명령어 메모리는 읽기 전용 장치로, 프로그램은 외부 수단을 통해 메모리에 로드됩니다. 핵 플랫폼 하드웨어 시뮬레이터에서 핵 기계어 프로그램이 담긴 텍스트 파일을 명령어 메모리에 불러와 실행하게 됩니다.

핵 CPU 는 2장에서 제작한 ALU와 세 종류의 레지스터(데이터, 주소지정, PC 레지스터)로 구성됩니다.

핵 기계어는 두 종류의 16비트 명령이 있습니다. 0vvvvvvvvvvvvvvv 의 형태인 주소 명령어와 111acccccdddjjj 의 형태인 계산 명령어가 있습니다.

컴퓨터 아키텍쳐에서 PC칩의 출력에서 나온 선은 ROM의 칩의 주소의 입력으로 연결됩니다. 여기서 ROM 칩은 PC가 가리키는 명령어 메모리 위치의 값인 ROM[PC]를 계속 출력합니다. 이 값은 현재 명령어입니다. (current instruction) 전반적인 컴퓨터 연산이 한 클럭 주기동안 이뤄지는 행동은 아래와 같습니다.

2.1.1 실행 (execute)

현재 명령어들의 비트들은 여러 칩에 동시에 전달됩니다. 만약 명령어가 주소명령어라면 명령어에 있는 15비트 상수는 A레지스터에 기록됩니다. (주소 명령어는 최상위 비트가 0) 명령어가 계산 명령어라면 그 안에 a, b, d, j 비트는 제어 비트가 되어 ALU나 레지스터가 그 명령어를 수행하게 됩니다. (계산 명령어는 최상위 비트가 1)

2.1.2 인출 (Fetch)

다음에 인출할 명령어는 현재 명령어의 점프 비트 및 ALU 출력에 따라 결정되게 됩니다. 점프가 실제로 이뤄질때는 이 두 값을 같이 봐야 합니다. 만약 점프가 이뤄진다면 PC는 A레지스터의 값으로 설정됩니다. 점프가 이뤄지지 않는다면 PC는 1이 증가합니다. 다음 클럭 주기에는 PC가 가리키는 명령어가 ROM에 출려이 되어 다음 주기가 이어집니다.

2.2 중앙 처리 장치

핵 플랫폼은 4장에서 제작한 핵 기계어로 작성된 16비트 명령어를 실행할 수 있도록 설계되었습니다. CPU는 두개의 별도 메모리 모듈에 연결됩니다. 하나는 필요한 명령어를 인출하는데 쓰는 명령어 메모리이고, 다른 하나는 데이터 값을 읽거나 쓰는데 사용하는 메모리입니다.

image

2.3 명령어 메모리

핵 명령어 메모리는 직접 접근 읽기 전용 메모리 또는 ROM이라 불리는 칩 상에 구현됩니다. 핵 ROM은 주소 지정 가능한 32K개의 16비트 레지스터들로 구성됩니다.

image

2.4 데이터 메모리

핵의 데이터 메모리 인터페이스는 3장에서 구현한 일반적인 RAM 장치의 인터페이스와 동일합니다. 레지스터 n의 내용을 읽으려면 메모리의 address 입력에 n을 넣고 out 출력을 검사하면 됩니다. 레지스터 n의 값 v를 쓰려면 in입력에 v를 넣고 address 입력에 n을 넣고 메모리의 load 비트를 활성화하면 됩니다.

데이터 메모리는 컴퓨터의 범용 데이터 저장소 역할 외에도, 메모리 맵을 통한 CPU와 입력/출력 장치 사이의 통신도 맡는다.

2.4.1 메모리 맵을

핵 플랫폼은 사용자와 상호작용을 위한 주변 장치로 스크린과 키보드를 사용합니다. 그리고 이 두 장치는 메모리 매핑 버퍼를 통해 컴퓨터와 통신하게 됩니다. 예를 들어 스크린 메모리 맵이라 불리는 특정 메모리 주소에 word를 읽고 쓰면서 스크린에 이미지를 확인하거나 입력할 수 있습니다. 또한 키보드 메모리 맵이라 불리는 특정 메모리 word를 읽어 키보드에서 어떠한 키가 눌린 상태인지 알 수 있습니다.

2.4.2 스크린

핵 컴퓨터의 스크린은 512 * 256 흑백 픽셀로 되어 있습니다. 실제 통신은 메모리 맵을 통해서 하며, 메모리 맵은 스크린이라는 이름의 칩으로 구현되어 있습니다. 이 칩은 보통의 메모리처럼 읽고 쓰기가 가능합니다. 또한 이 칩에 비트를 기록하면 실제 스크린의 픽셀로 표시됩니다.

2.4.3 전체 메모리

핵 플랫폼의 전체 주소 공간은 메모리라는 칩으로 제공됩니다. 이 메모리 칩에는 RAM과 스크린 맵 및 키보드 맵이 포함되어 있습니다. 이 모듈들은 세개로 나뉜 메모리의 주소 공간에 각각 위치합니다.

image

2.5 컴퓨터

핵 하드웨어 계층에서 최상위 칩은 핵 기계어로 작성된 프로그램을 실행하도록 설계된 컴퓨터 시스템입니다. 컴퓨터 칩은 CPU, 데이터 메모리, 명령어 메모리, 스크린, 키보드 및 그 외 컴퓨터 작동에 필요한 모든 하드웨어 장치들로 구성됩니다. 이 컴퓨터에서 프로그램을 실행하려면 코드를 ROM에 미리 로드해야 합니닫. 스크린 및 키보드는 메모리 맵을 통해 제어합니다.

image

Leave a comment