본문으로 건너뛰기

CPU의 작동 원리

ALU와 제어장치


  • ALU: 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들인다.
  • ALU는 연산 결과와 플래그를 내보낸다.
  • 플래그: 연산 결과에 대한 추가적인 상태 정보
    • 부호 플래그: 연산한 결과의 부호를 나타낸다.
    • 제로 플래그: 연산 결과가 0인지 여부를 나타낸다.
    • 캐리 플래그: 연산 결과 올림수나 빌림수가 발생했는지를 나타낸다.
    • 오버플로우 플래그: 오버플로우가 발생했는지를 나타낸다.
    • 인터럽트 플래그: 인터럽트가 가능한지를 나타낸다.
    • 슈퍼바이저 플래그: 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타낸다.

  • 제어장치: 클럭, 현재 수행할 명령어, 플래그, 제어 신호를 받아들인다.
    • 클럭: 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
    • CPU가 해석해야할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장된다.
    • 플래그는 ALU연산에 대한 추가적인 상태 정보이다. 제어장치가 제어 신호를 통해 컴퓨터 부품들을 제어할 때 이 중요한 참고 사항을 무시하면 안된다.
    • 제어 신호는 CPU뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있다. 제어 장치는 에저 버스를 통해 외부로부터 전달된 제어 신호를 받아들이기도 한다.
  • 제어 신호: 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호
  • 제어장치는 CPU 내부와 외부로 제어 신호를 내보낸다.

레지스터

  • 프로그램 카운터: 메모리에서 읽어 들일 명령어의 주소를 저장한다. 명령어 포인터라고 부르는 CPU도 있다.

  • 명령어 레지스터: 방금 메모리에서 읽어 들인 명령어를 저장한다. 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 내보낸다.

  • 메모리 주소 레지스터: 메모리의 주소를 저장한다. CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거친다.

  • 메모리 버퍼 레지스터: 메모리와 주고받을 값(데이터, 명령어)을 저장한다. 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거친다.

  • 범용 레지스터: 데이터와 주소를 모두 저장할 수 있다.

  • 플래그 레지스터: 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장한다.

  • 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식

    스택 포인터: 스택의 꼭대기를 가리키는 레지스터

  • 변위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식

    → 변위 주소 지정 방식은 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등으로 나뉜다.

    1. 상대 주소 지정 방식: 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식

    2. 베이스 레지스터 주소 지정 방식: 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식

명령어 사이클과 인터럽트


  • 명령어 사이클: 하나의 명령어가 처리되는 주기, 인출, 실행, 간접, 인터럽트 사이클로 구성되어 있다.

    • 실행 사이클: CPU로 가져온 명령어를 실행하는 단계, 제어장치가 명령어 레지스터에 담긴 값을 해석하고 제어 신호를 발생시키는 단계이다.
  • 인터럽트: CPU의 정상적인 작업을 방해하는 신호

    • 동기 인터럽트(예외): CPU에 의해 발생하는 인터럽트
      ex) CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생

    • 비동기 인터럽트(하드웨어 인터럽트): 주로 입출력장치에 의해 발생하는 인터럽트
      → 하드웨어 인터럽트를 사용하면 CPU는 완료 인터럽트를 받을 때까지 다른 작업을 처리할 수 있다.

  • 하드웨어 인터럽트 처리 순서

    1. 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
    2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
    3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
    4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
    5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
    6. 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해 둔 작업을 복구하여 실행을 재개한다.
  • 인터럽트 서비스 루틴: 인터럽트를 처리하기 위한 동작들로 이루어진 프로그램, 어떻게 처리하고 작동해야 할지에 대한 정보를 알 수있다.

CPU의 작업을 방해하는 인터럽트에 대한 요청

인터럽트 요청 신호를 받아들일지 무시할지 결정하는 비트

인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보