본문 바로가기
cs

[혼공운영체제] 2. CPU의 작동원리(ALU와 제어장치, 레지스터)

by 이쟝 2023. 4. 13.
인프런의 개발자를 위한 컴퓨터 공학1 : 혼자 공부하는 컴퓨터 구조 + 운영체제 강의를 듣고, 학습 및 요약

2-1. ALU와 제어장치

  • ALU는 계산하는 장치
  • 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치

1. ALU - 내보내는 정보

ALU 구조

  • 계산을 하기 위해서는 피연산자와 수행할 연산이 필요 
    • 2+2를 계산하기 위해서는 2라는 피연산자와 +라는 수행할 연산이 필요함
  • ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들이고, 결과값을 레지스터에 저장한다. 
    • CPU가 레지스터에 접근하는 속도가 메모리에 접근하는 속도보다 빠르기 때문에 레지스터에 저장함!
  • 플래그 : 연산 결과에 대한 부가 정보
    • ex) 양수와 음수를 구분할 때 플래그 사용
    • 플래그는 플래그 레지스터에 저장됨
    • 만약 연산 결과가 결과를 담을 레지스터에 비해 너무 크면 플래그에 담기게 된다. => ex) 오버플로우 플래그
플래그 종류 의미 사용 예
부호 플래그 연산한 결과의 부호를 나타냄 1일 때 결과 음수, 0일 때 결과 양수 
제로 플래그 연산 결과가 0인지 여부 나타냄 1일 때, 결과 0, 0일 때 결과는 0이 아님
캐리 플래그 연산 결과 올림수나 빌림수 발생했는 지 나타냄  1일 때 올림수나 빌림수 발생, 0일 때 발생하지 않았음
오버플로우 플래그 오버플로우가 발생했는지 나타냄  1일 때, 오버플로우 발생, 0일 때 발생하지 않았음
인터럽트 플래그 인터럽트가 가능한지 나타냄 1일 때, 인터럽트 가능, 0일 때 인터럽트 불가능
슈퍼바이저 플래그 커널모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타냄 1일 때, 커널 모드로 실행 중, 0일 때, 사용자 모드로 실행 중

플래그 예시

 

2. 제어장치

1) 받아들이는 정보

  • 클럭 : 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
    • 클럭 신호에 맞춰서 명령어들이 수행된다.
  • 제어장치는 실행하고자 하는 명령어를 받아들인다. 
    • 해석할 명령어는 명령어 레지스터에 담긴다.
  • 제어장치는 클럭과 해석할 명령어를 받아서 ALU에 전달한다. 
  • 입출력장치를 비롯해 외부 주변장치에서 제어 신호를 발생할 수 있기 때문에 제어장치에서 이러한 제어 신호도 받는다. 

2) 내보내는 정보

  • 기본적으로 제어 신호를 내보낸다.
    • CPU 내부에 전달할 수 있고, CPU 외부에 전달할 수 있다.
    • CPU 내부에 전달할 때 레지스터ALU에 전달할 수 있다.
      • 레지스터에 전달하는 신호 => 레지스터를 움직이게 하는 신호,  ALU에 전달하는 신호 => 수행할 연산을 지시하는 제어신호
    • CPU 외부에 전달할 때 메모리입출력장치에 전달할 수 있다.
      • 메모리에 전달하는 신호 => 메모리를 읽거나 쓰는 것을 지시하는 신호,  입출력장치에 전달하는 신호 => 입출력장치를 읽거나 쓰는 것, 테스트를 지시하는 신호


2-2. 레지스터

CPU 내부의 작은 임시저장장치
프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장

  • CPU 내부에는 다양한 레지스터들이 있고, 각기 다른 역할을 가진다.
    • 프로그램 카운터, 명령어 레지스터, 메모리 주소 레지스터, 메모리 버퍼 레지스터, 플래그 레지스터, 범용 레지스터, 스택 포인터, 베이스 레지스터 
프로그램 카운터 메모리에서 가져올 명령어의 주소(메모리에서 읽어들일 명령어의 주소)
Instruction Pointer(명령어 포인터)라고 부르는 CPU도 있음
명령어 레지스터 해석할 명령어(방금 메모리에서 읽어들인 명령어)
제어장치가 해석하고 제어신호를 내보냄
메모리 주소 레지스터 메모리의 주소
CPU가 읽어들이고자 하는 주소를 주소 버스(주소를 주고 받는 통로)로 보낼 때 거치는 레지스터
메모리 버퍼 레지스터 메모리와 주고받을 값(데이터와 명령어)
CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터

각 레지스터에 데이터가 담기는 과정

더보기

예시) 프로그램을 이루는 명령어가 각각 하나의 메모리 번지를 차지하고 있다. (맨 처음부터 실행된다.)

  1. 처음부터 실행되기 때문에 프로그램 카운터에는 1000이 저장된다.(메모리에서 읽어들일 명령어의 주소)
1번

2. 프로그램 카운터에 저장되어 있는 주소를 메모리 주소 레지스터로 복사된다.

2번

3. 메모리한테 몇 번지 주소를 읽어야 하는 지(주소버스) 메모리를 읽는 제어 신호(제어버스)와 함께 보낸다.

3번

4. 메모리는 주소의 저장된 값(1101)을 메모리 버퍼 레지스터로 데이터 버스를 통해서 저장한다. 

  • 이 때 프로그램 카운터에는 다음으로 실행할 주소 값이 들어가야되기 때문에 프로그램 카운터가 1이 증가 된다.
  • 이 것이 프로그램을 순차적으로 실행할 수 있는 원리가 된다. 
  • BUT! 순차적인 실행 흐름이 끊기는 경우
    • 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시(JUMP, CONDITIONAL JAMP, CALL, RET)
    • 인터럽트 발생 시 등
4번

5. 메모리 버퍼 레지스터에 있는 제어장치에게 명령어(1101)을 해석시키기 위해서 명령어 레지스터에 저장한다. 

5번

 

플래그 레지스터 연산 결과 또는 CPU 상태에 대한 부가적인 정보
현재 CPU가 어떤 연산을 하고 있었는 지와 CPU 상태에 대한 정보를 알 수 있음
범용 레지스터 다양하고 일반적인 상황에서 자유롭게 사용
메모리 주소 레지스터에는 주소만 담을 수 있고, 메모리 버퍼 레지스터에는 명령어, 데이터만 담을 수 있으면 범용 레지스터에는 주소, 명령어, 데이터 다 담을 수 있음
스택 포인터 주소 지정에 사용
스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터 (스택이 어디까지 차 있는지에 대한 표시)
베이스 레지스터 주소 지정에 사용
변위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더해 유효 주소 얻기
- 기준 주소 저장

특정 레지스터를 이용한 주소 지정 방식

  • 스택 주소 지정 방식

스택 주소 지정 방식
스택 영역

  • 변위 주소 지정 방식

변위 주소 지정 방식

연산 코드(이런 내용을 수행해라) 레지스터(이 레지스터 값과) 오퍼랜드(이 주소를 더한 곳에 있는 데이터로)

변위 주소 지정 방식에는 두가지가 있음

  1. 상대 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더해 유효 주소를 얻는 방법
    1. 프로그램 카운터 + 오퍼랜드 필드의 값(변위) = 코드 실행!
    2. 실행할 명령어의 주소에서 거기서 필드의 값을 더한다.
  2. 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더해 유효 주소를 얻는 방법
    1. 베이스 레지스터(기준 주소) + 오퍼랜드 필드의 값(변위) = 코드 실행!
    2. 즉 상대 주소 지정 방식과는 다르게 기준 주소가 기준이 되어서 거기서 필드의 값을 더해준다.