CPU

박진우·2023년 5월 16일
0

CPU의 동작원리를 알기 위해서는 CPU 내부에서 일시적으로 데이터를 저장하며, 속도가 가장 빠른 메모리이다. 레지스터는 종류가 상당히 많은데, 프로그램 카운터, 메모리 주소 레지스터, 메모리 버퍼 레지스터, 명령어 레지스터 등이 있다.
프로그램 카운터에는 다음에 불러올 메모리의 주소가 들어있다.
메모리 주소 레지스터는 프로그램 카운터에서 수행할 주소를 넘겨받아 그 주소에서 데이터를 가져와 메모리 버퍼 레지스터에 저장하는 역할을 한다. 메모리 버퍼 레지스터는 메모리 주소 레지스터가 가져온 데이터, 명령을 일시적으로 저장한다. 저장된 내용 중 명령은 명령어 레지스터, 데이터는 누산기 레지스터로 이동된다. 명령어 레지스터는 명령에 관한 데이터가 저장된다.
누산기 레지스터에는 연산의 결과 값이나 중간 값을 일시적으로 저장한다. 누산기 레지스터에서의 최종 연산 결과는 메모리 버퍼 레지스터를 통해 메모리로 전송된다.
명령어 레지스터에 저장된 명령어는 제어장치로 넘어가 제어장치에서 명령어가 해석하여 시스템에 지시를 내린다.
ALU는 산술 연산을 진행한다.
이렇게만 설명을 적어놓으면 이해하기 힘들 수 있으니 하나의 예시로, CPU가 C = A + B라는 명령을 처리하는 과정을 알아보자.
일단 일반적으로 사람이 사용하는 프로그래밍 언어인 c언어, 파이썬 등은 CPU가 바로 해석할 수 있는 언어가 아니기 때문에, 컴파일러를 통해 CPU가 해석하고 실행할 수 있는 어셈블리어로 바뀌게 된다. 이 어셈블리어는 다시 어셈블러를 통해 기계어로 바뀌게 된다.
C = A + B(변수 A, B, C의 주소를 각각 10, 11, 12라고 가정)라는 명령을 컴파일러를 통해 어셈블리어로 변환하게 되면
LOAD [10]
ADD [11]
STORE [12]
라고 변환된다. 이를 해석하면 "10번째 주소에 있는 데이터를 읽어와서", "11번째 주소에 있는 데이터와 더하고", "그 결과값을 12번째 주소에 저장하라."라고 해석할 수 있다. 이 어셈블리어는 기계어로
1001100000001010
1100110000001011
1110100000001100
라고 표현할 수 있으며, 앞의 6비트는 명령이고 뒤에 오는 값은 10비트로 데이터이다. 주소 하나에는 8비트를 저장하므로, 두 줄에 걸쳐 한 언어가 저장되며 이 두 줄이 CPU가 처리할 수 있는 하나의 언어이다.
이제 CPU에서 이 값을 처리하는 과정을 알아보자. 프로그램 카운터에 실행할 명령의 주소가 들어 있다. 이 주소는 메모리 주소 레지스터로 전달되고, 그 주소에 있는 값을 메모리 버퍼 레지스터로 전달한다. 이 과정을 인출이라고 한다. 이제 메모리 버퍼 레지스터에는 1001100000001010=LOAD [10]이라는 값이 있다. 이 값은 명령어이기 때문에 명령어 레지스터에 저장된다. 이후 프로그램 카운터에 2(다음에 검사할 메모리가 두 칸 아래에 있으니까)가 더해진다. 명령어 레지스터에 저장된 명령은 제어장치로 가서 해석된다. 이 과정을 해석이라고 한다. 이 명령은 10번째 주소에 있는 값을 읽어오라는 명령이기 때문에, 메모리 주소 레지스터에 10이 입력되고, 10번째 값에 저장된 값을 메모리 버퍼 레지스터에 저장한다. 이는 명령이 아닌 데이터기 때문에 누산기로 넘어간다.
이후 다음 줄인 1100110000001011=ADD [11]을 처리하기 위해 프로그램 카운터에 있는 주소를 메모리 주소 레지스터로 넘겨준다. 메모리 주소 레지스터는 받은 주소에서 값을 가져와 메모리 버퍼 레지스터로 넘겨준다. 메모리 버퍼 레지스터에는 ADD [11]이라는 명령이 들어왔으므로 이를 명령어 레지스터를 거쳐 제어장치로 넘긴다. 이후 프로그램 카운터에 2를 더한다. 제어장치에서 이 명령은 11번째 주소에 있는 값을 더하라는 뜻이므로 메모리 주소 레지스터에 11이라는 값을 넘기고, 메모리 주소 레지스터는 다시 11번째 주소에 있는 값을 읽어와 메모리 버퍼 레지스터로 보낸다. 이 값은 데이터이기 때문에 누산기로 간다. 이제 누산기에는 10번째 주소의 값과 11번째 주소의 값이 같이 있고, 제어 장치로부터 둘을 더하라는 명령을 받았기에 ALU로 가서 둘을 더한 후 다시 누산기에 누적된다.
다음 줄은 STORE [12]로 12번째 주소에 값을 저장하라는 명령이다. 프로그램 카운터 -> 메모리 주소 레지스터 -> 메모리 버퍼 레지스터 -> 명령어 레지스터 -> 제어장치로 넘어가서 명령이 해석되어 누산기의 값을 메모리 버퍼 레지스터를 통해 12번째 주소에 저장한다.

profile
SRIHS Infosec

0개의 댓글