먼저 컴퓨터의 4가지 핵심 부품인 CPU, 메모리, 보조기억장치, 입출력 장치는 메인보드에 연결되어 버스중에서 시스템버스를 통해서 필요한 데이터들을 주고 받습니다.
이중에서도 이번글은 CPU의 ALU, 제어장치(Control Unit)의 동작방식을 알아보고 핵심 레지스터들의 종류와 주소 지정방식의 큰개념들을 살펴보도록 하겠습니다.
먼저
메모리의 경우 현재 실행중인 프로그램의 명령어, 데이터를 저장합니다.
“주소”단위로 나누어서 저장합니다.
CPU의 경우 메모리에 저장된 명령어를 읽고 명령어를 해석하고 명령어를 실행하는 부품입니다.
이 부품은 ALU, 레지스터, 제어장치로 구성되어 있습니다.
이 세가지의 핵심역할은
ALU의 경우 계산, 레지스터는 임시 저장장치 역할, 제어장치는 제어신호를 보내고 → 명령어를 해석합니다.
여기서 “제어신호”란? 컴퓨터 부품을 관리, 작동시키는 전기 신호입니다.
( 컴퓨터의 CPU, 메모리, 보조기억 장치, 입출력 장치는 메인보드에 연결되어 제어신호가 시스템 버스(주소버스, 데이터 버스, 제어버스)를 타고 전달됩니다.)
ALU는 레지스터로부터 데이터를 전달받고 제어장치로 부터 제어신호를 전달받아 자신이 할일을 한뒤 결과값을 레지스터에 담습니다.
이 결과값을 담는 과정에서 결과값의 부가적인 정보를 플래그 레지스터에도 함께 담습니다.
플래스 레지스터에는 결과값에 대한 부가적인 정보들이 기록되는데
간단한 예로들면 컴퓨터에는 이진 데이터로 저장이 되는데 가령 101이라는 이진 데이터가 있을 경우 해당 데이터가 음수인지 양수인지 구분하기가 어렵습니다.
101이라는 이진 데이터를 10진법으로 보면 5일 수도 있지만 "2의 보수법"으로 음수를 구한 결과값일 수도 있기 때문입니다.
(101이 2의 보수법으로 나온 음수라고 가정을하고 양수를 구하면 010 + 1 => 011를 10진수로 변경하면 3입니다. 즉 10진수 3의 음수를 이진법으로 구한뒤 2의 보수법으로 음수를 구하면 101일 수 있다는 말입니다.)
그래서 해당 이진수를 위와같이 플래그 레지스터의 부호 플래그에 0이라면 양수 1이라면 음수라고 참고데이터를 넣어줍니다.
제어 장치의 경우 플래그 레지스터로 부터 플래그를 전달받고, 클럭신호를 전달받으며 명령어 레지스터로부터 해석할 명령어를 전달 받은뒤 이를 내부/외부로 제어 신호를 보냅니다.
내부로는 CPU의 레지스터들과 ALU에게 전기신호를 보내고 외부로는 메모리와 입출력 장치로 제어신호를 보냅니다.
클럭은 컴퓨터의 모든 부품을 일사분란하게 동작할 수 있게 해주는 시간단위이며
이를 CPU속도로 보아도 무방하긴 합니다.
이까지가 정말 기본적인 ALU, 제어장치의 큰 동작방식 이였습니다.
그러다면 CPU내부의 어떤 레지스터들에게 제어신호를 보내는지 알아보도록 하겠습니다.
먼저 CPU의 핵심 레지스터들은
- 프로그램 카운터
- 명령어 레지스터
- 메모리 주소 레지스터
- 메모리 버퍼 레지스터
- 플래그 레지스터
- 범용 레지스터
- 스택 포인터
- 베이스 레지스터
등이 있습니다. 위의 레지스터들은 필수적인 레지스터들이며 이보다 더 많은 레지스터 종류들이 있습니다.
먼저 핵심은 프로그램 카운터, 명령어 레지스터, 메모리 주소 레지스터, 메모리 버퍼 레지스터 입니다.
CPU내부에 있는 프로그램 카운터라는 레지스터는 메모리에서 읽어 들일 명령어의 주소를 저장합니다.
이후 명령어 레지스터는 방금 메모리에서 읽어들인 명령어를 저장합니다.
메모리 주소 레지스터는 읽어들인 메모리의 주소를 저장합니다.
메모리 버퍼 레지스터는 메모리와 주고받을 값을 저장합니다. 메모리에 쓰고싶은 값이나 메모리로 부터 전달 받은 값을 데이터 버스를 통해 가집니다.
가령 메모리의 1000번지주소에 있는 1001이라는 데이터를 읽는다고 가정을 할경우 위처럼 그릴 수 있겠습니다. ㅎㅎ;;
프로그램 카운터는 다음 메모리의 다음 명령어를 읽기 위해 꾸준히 증가하며 위의 과정을 반복하며 메모리의 명령어들을 처리합니다.
그다음 나머지 레지스터들을 살펴보면
범용 레지스터의 경우 상대적으로 일반적이고 자유롭게 사용이 가능한 레지스터입니다. 메모리 주소 레지스터의 경우 메모리의 주소만 저장이 가능한데 범용의 경우 주소 + 데이터 둘다 저장이 가능한 유용한 레지스터입니다.
플래그 레지스터의 경우 위에서 설명한 대로 ALU의 연산결과의 참고할만한 정보들을 저장하는 레지스터입니다. 위에서 살펴본대로 부호 플래그에 양수, 음수를 기록합니다. (나머지 플래그부분도 다른 기능에서 사용을 합니다)
그리고 스택 포인터, 베이스 레지스터는 "주소 지정방식"에서 사용될 수 있는 특별한 레지스터들 입니다.
어떤 주소지정방식에서 사용되냐하면 먼저
"스택 주소 지정"방식에는 스택 포인터라는 레지스터가 사용되고
"변위 주소 지정방식"에는 베이스 레지스터가 사용됩니다.
스택 주소 지정방식의 스택 포인터는 LIFO방식의 스택의 맨 꼭대기 주소를 가르키는 주소지정 방식입니다.
변위 주소 지정방식은 오퍼랜드의 필드값과 특정레지스터의 값을 더하여 유효한 주소를 얻어내는 주소 지정방식입니다.
여기에 이제
- 상대 주소 지정방식
- 베이스 레지스터 주소 지정 방식
이렇게 두가지로 나뉩니다.
간단하게 말하면 상대 주소 지정방식은 오퍼랜드와 프로그램 카운터 값을 더하여 유효주소를 얻어내는 방식이고
베이스 레지스터 주소 지정방식은 오퍼랜드와 베이스 레지스터의 값을 더하여 유효주소를 얻어 내는 방식입니다. 베이스 레지스터에는 실행중인 프로그램의 가장 작은 주소 즉, 시작 주소값이 저장됩니다.
감사합니다 :)
(위의 오퍼랜드의 개념과 더 자세한 부분은 다른 글에서 CPU명령어인 ISA글을 작성하면서 같이 적도록 하겠습니다.)
'CS' 카테고리의 다른 글
[CS] 가상 메모리와 페이징 (0) | 2023.08.15 |
---|---|
[CS] 스와핑(Swapping) (0) | 2023.08.09 |
[CS] 논리주소와 물리주소 (0) | 2023.08.07 |
[CS] Context Switching(문맥 교환) (0) | 2023.08.05 |
[CS] Mutex Lock과 Semaphore (0) | 2023.08.02 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!