2022-11-30 @이영훈
1. CPU의 구성과 동작
CPU의 기본 구성
CPU는 산술논리 연산장치, 제어장치, 레지스터로 구성되며, 이것들의 협업으로 작업을 처리한다.
산술논리 연산장치
요리사가 재료를 삶거나 찌거나 볶듯이 CPU에서 데이터를 연산하는 장치가 산술논리 연산장치(Arithmetic and Logic Unit. ALU)이다. 산술논리 연산장치는 데이터의 덧셈, 뺄셈, 곱셈, 나 눗셈 같은 산술 연산과 AND, OR 같은 논리 연산을 수행한다.
제어장치
요리를 할 때 요리사의 머릿속에서는 도마 위의 재료를 가져와라'. '양파 껍질을 미리 벗겨 놓아라', 다 된 요리를 접시에 담이라' 등의 지시가 이루어진다. 이처럼 CPU에서 작업을 지시하는 부분을 제어장치라고 한다.
레지스터
재료를 필요한 만큼 쥐고 있는 것처럼 CPU 내에 데이터를 임시로 보관하는 곳을 레지스터(register)라고 한다
CPU의 명령어 처리 과정
CPU의 산술논리 연산장치, 제어장치, 레지스터가 어떻게 협업하여 작업하는지 살펴보자. [소스코드 2-1]은 D2에 저장된 값과 D3에 저장된 값을 더하여 그 결과를 sum에 넣으라는 의미이다.
여기서 변수 D2, D3, sum은 데이터를 저장할 수 있는 메모리 주소의 다른 이름으로, 메모리 주소를 외우기가 어렵기 때문에 주소 대신 적당한 이름을 만들어 붙인 것이다.
int D2=2, D3=3, sum;
sum = D2 + D3;
C
복사
CPU는 0과 1의 2진수로 이루어진 기계어machine code만 인식한다. 따라서 위 코드를 실행하 려면 컴파일러를 이용하여 기계어로 바꾸어야 한다. 여기서는 사람이 이해하기 어려운 기계 어 대신 어셈블리어로 작성한 코드를 살펴보자.
어셈블리어는 기계어를 사람이 이해하기 쉬 운 기호와 일대일로 대응시켜 기호화한 언어이다
LOAD mem(100), register 2;
LOAD mem(120), register 3;
ADD register 5, register 2, register 3;
MOVE register 5, mem(160);
Assembly
복사
•
01 행: 메모리의 100번지(D2)에 있는 값을 레지스터 2로 가져온다.
•
02행: 메모리의 120번지(D3)에 있는 값을 레지스터 3으로 가져온다.
•
03행: 레지스터 2와 레지스터 3에 저장된 값을 더한 결과를 레지스터 5에 넣는다.
•
04행: 레지스터 5의 값을 메모리의 160번지(sum)로 옮긴다.
레지스터의 종류
CPU는 필요한 데이터를 메모리에서 가져와 레지스터에 저장하고 산술논리 연산장치를 이용하여 연산을 한 후, 그 결과를 다시 레지스터에 저장했다가 메모리로 옮긴다.
이때 사용되는 레지스터는 데이터 레지스터와 주소 레지스터이다. 데이터 레지스터와 주소 레지스터는 사용자 프로그램에 의해 변경되기 때문에 사용자 가시 레지스터(user-visible register)라고 부른다.
사용자 가시 레지스터
•
데이터 레지스터(DR): 데이터 레지스터(data register)는 메모리에서 가져온 데이터를 임시로 보관 할 때 사용한다. CPU에 있는 대부분의 레지스터가 데이터 레지스터이다.
•
주소 레지스터(AR): 데이터 또는 명령어가 저장된 메모리의 주소는 주소 레지스터(address register)에 저장된다.
데이터 레지스터와 주소 레지스터 외에 특별한 용도로 사용되는 레지스터도 있는데 이를 특수 레지스터라고 한다. 특수 레지스터는 사용자가 임의로 변경할 수 없기 때문에 사용자 불가시 레지스터(user-invisible register)라고 부른다.
사용자 불가시 레지스터
•
프로그램 카운터(PC): CPU는 다음에 어떤 명령어를 처리해야 할지 알아야 한다. program counter는 다음에 실행할 명령어의 주소를 기억하고 있다가 제어장치에 알려준다.
•
명령어 레지스터(IR): 현재 실행 중인 명령어를 저장한다. 제어장치는 명령어 레지스터에 있는 명령을 해석한 후 외부 장치에 적절한 제어 신호를 보낸다.
•
메모리 주소 레지스터(MAR): 메모리에서 데이터를 가져오거나 반대로 메모리로 데이터를 보낼 때 주소를 지정하기 위해 사용한다. 명령어를 처리하는 과정에서 필요한 메모리 주소를 이 레지스터에 넣으면 메모리 관리자가 이를 인식하여 해당 메모리 위치의 데이터를 가져오거나 해당 메모리 위치에 데이터를 저장한다.
•
메모리 버퍼 레지스터(MBR): 메모리에서 가져온 데이터나 메모리로 옮겨 갈 데이터를 임시로 저장한다. 메모리 버퍼 레지스터는 항상 메모리 주소 레지스터와 함께 동작한다.
'LOAD mem(100), register 2;'의 실행 과정을 통해 특수 레지스터의 역할을 살펴보자.
1.
프로그램 카운터(PC)에는 현재 실행 중인 코드의 행 번호 1이 저장되고 이 번호는 제어장치에 전송된다.
명령어 레지스터(IR)에는 'LOAD mem(100), register 2;’의 LOAD가 탑재된다.
2.
제어장치가 명령어 레지스터에 있는 명령을 해석하여 메모리에 있는 데이터를 가져오라는 제어 신호를 보낸다.
3.
메모리 주소 레지스터에는 100이 저장되고, 메모리 관리자는 메모리의 100번지에 저장된 값을 메모리 버퍼 레지스터로 가져온다.
4.
제어 장치는 메모리 버퍼 레지스터에 저장된 값을 레지스터 2로 옮긴다.
지금까지 설명한 레지스터 말고도 CPU가 사용하는 레지스터는 아주 많다. 그중 프로그램 상태 레지스터(Program Status Register. PSR)는 산술논리 연산장치와 연결되어 있으며 연산 결과가 양수인지, 음수인지, 0이 아닌지 또는 자리 올림의 유무 등을 저장한다.
프로그램 상태 레지스터는 D2-D3의 결과를 임시로 저장하고 있다가 음수인지 양수인지를 제어 장치에 알려주어 다음에 몇 번 행으로 이동할지를 결정한다.
if(D2 - D3 > 0)
goto 100;
else
goto 200;
C
복사
버스의 종류
버스는 CPU와 메모리, 주변장치 간에 데이터를 주고받을 때 사용한다.
버스에는 다음 작업을 지시하는 제어 신호, 메모리의 위치 정보를 알려주는 주소, 처리할 데이터가 오고 가며 각각 제어 버스, 주소 버스, 데이터 버스에 실린다.
제어 버스
다음에 어떤 작업을 할지 지시하는 제어 신호가 오고 간다.
메모리에서 데이터를 가져올지, 아니면 처리한 데이터를 옮겨놓을 지에 대한 지시 정보가 오고 가는데, 메모리에서 데이터를 가져올 때는 읽기 신호를 보내고, 처리한 데이터를 메모리로 옮겨놓을 때는 쓰기 신호를 보낸다.
주변장치의 경우도 마찬가지로 하드디스크에 저장 명령을 내리거나 사운드카드에 소리를 내라는 명령을 내릴 때 제어 버스를 통해 전달된다.
메모리에서 오류가 발생하거나 네트워크 카드에 데이터가 모두 도착했다는 신호는 모두 제어 버스를 통해 CPU로 전달된다. 제어 버스의 신호는 CPU, 메모리, 주변장치와 양방향으로 오고 간다.
주소 버스
메모리의 데이터를 읽거나 쓸 때 어느 위치에서 작업할 것인지 를 알려주는 위치 정보(주소)가 오고 간다.
주변장치의 경우도 마찬가지로 하드디스크의 어느 위치에서 데이터를 읽어올지, 어느 위치에 저장할지에 대한 위치 정보가 주소 버스를 통해 전달된다.
주소 버스는 메모리 주소 레지스터와 연결되어 있으며 단방향이다. CPU에서 메모리나 주변장치로 나가는 주소 정보는 있지만 주소 버스를 통해 CPU로 전달되는 정보는 없다.
데이터 버스
데이터가 데이터 버스에 실려 목적지까지 이동한다.
데이터 버스는 메모리 버퍼 레지스터와 연결되어 있으며 양방향이다.
2. 메모리의 종류와 부팅
메모리에는 실행에 필요한 프로그램과 데이터가 존재하며, CPU와 협업하여 작업이 이루어진다.
메모리를 이루는 소자 하나의 크기는 1bit로 0 또는 1이 저장된다. 소자 하나만으로 데이터를 표현할 수 없어 메모리 주소는 바이트 단위로 지정되고, 메모리에서 데이터를 읽거나 쓸 때는 워드 단위로 움직인다.
버스의 대역폭이 32bit인데 굳이 1bit 단위로 데이터를 옮길 필요가 없기 때문이다.
메모리 종류
메모리는 읽거나 쓸 수 있는 램(RAM, Random Access Memory)과 읽기만 가능한 롬(ROM. Read Only Memory)으로 구분된다.
램은 무작위로 데이터를 읽어도 저장된 위치와 상관없이 같은 속도로 데이터를 읽을 수 있다는 의미에서 붙은 이름이다.
램은 전력이 끊기면 데이터가 사라지는 휘발성 메모리와 전력이 끊겨도 데이터를 보관할 수 있는 비휘발성 메모리로 나뉜다.
B 작업이 데이터를 읽거나 쓸 때마다 CPU는 해당 작업이 경계 레지스터와 한계 레지스터의 주소값 안에서 이루어지는지 검사한다.
만약 두 레지스터의 값을 벗어 난다면 메모리 오류와 관련된 인터럽트가 발생한다. 인터럽트가 발생하면 모든 작업이 중단되고 CPU는 운영체제를 깨워서 인터럽트를 처리하도록 시킨다. 메모리 영역을 벗어나서 발생한 인터럽트의 경우 운영체제가 해당 프로그램을 강제 종료시킨다.
메모리 보호
운영체제도 소프트웨어 중 하나라는 사실을 잊지 말아야 한다. 운영체제도 CPU를 사용하는 작업 중 하나이기 때문에 사용자의 작업이 진행되는(사용자 프로세스가 CPU를 차지하는) 동안에는 운영체제의 작업이 잠시 중단된다.
운영체제의 작업이 중단된 상태에서 사용자의 작업으로부터 메모리를 보호하려면 하드웨어의 도움이 필요하다.
메모리를 보호하기 위해 CPU는 현재 진행 중인 작업의 메모리 시작 주소를 경계 레지스터(bound register)에 저장한 후 작업을 한다.
또한 현재 진행 중인 작업이 차지하고 있는 메모리의 크기, 즉 마지막 주소까지의 차이를 한계 레지스터(limit register)에 저장한다.
그리고 사용자의 작업이 진행되는 동안 이 두 레지스터의 주소 범위를 벗어나는지 하드웨어적으로 점검함으로써 메모리를 보호한다.
B 작업이 데이터를 읽거나 쓸 때마다 CPU는 해당 작업이 경계 레지스터와 한계 레지스터의 주소값 안에서 이루어지는지 검사한다.
만약 두 레지스터의 값을 벗어 난다면 메모리 오류와 관련된 인터럽트가 발생한다. 인터럽트가 발생하면 모든 작업이 중단되고 CPU는 운영체제를 깨워서 인터럽트를 처리하도록 시킨다. 메모리 영역을 벗어나서 발생한 인터럽트의 경우 운영체제가 해당 프로그램을 강제 종료시킨다.
부팅
사용자가 컴퓨터의 전원을 켜면 롬에 저장된 바이오스가 실행된다. 바이오스는 CPU, 메모리, 하드디스크, 키보드, 마우스와 같은 주요 하드웨어가 제대로 작동하는지 확인한다.
만약 이상 이 있으면 ‘삐〜’ 소리와 함께 오류 메시지를 출력하고, 이상이 없으면 하드디스크의 마스터 부트 레코드(Master Boot Record, MBR)에 저장된 부트스트랩을 메모리로 가져와 실행한다.
마스터 부트 레코드는 하드디스크의 첫 번째 섹터를 가리키며, 운영체제를 실행하기 위한 코드인 부트스트랩(bootstrap)이 이곳에 저장되어 있다. 부트스트랩 코드는 운영체제를 메모리로 가져와 실행하는 역할을 하는 작은 프로그램이다.
마스터 부트 레코드에 있는 부트스트랩이 메모리에 올라오면 하드디스크에 저장된 운영체제를 메모리로 불러온다.
Reference
요리책 운영체제