Post

[혼자 공부하는 컴퓨터구조+운영체제]04장 CPU의 작동 원리

04-01 ALU와 제어장치

ALU

ALU가 받아들이는 정보

  • 레지스터를 통해 피연산자를 받는다.
  • 제어 장치로부터 제어 신호를 받는다.

ALU가 내보내는 정보

  • ALU는 연산한 결괏값을 내보내 일시적으로 레지스터에 저장한다.
    • 메모리에 자주 접근하면 프로그램 실행 속도가 느려지기 때문
  • ALU는 결괏값 외에 플래그를 내보낸다.
    • 플래그: 연산 결과에 대한 추가적인 상태 정보
      • 부호 플래그, 제로 플래그, 캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그 등
    • 플래그는 플래그 레지스터에 저장된다.

ALU에는 이 외에도 가산기, 보수기, 시프터, 오버플로우 검출기 등의 회로가 존재한다.

제어장치

  • 제어 신호를 내보내고 명령어 해석
    • 제어 신호: 컴퓨터 부품을 관리하고 작동시키기 위한 일종의 전기 신호

제어장치가 받아들이는 정보

  • 클럭
    • 컴퓨터 부품이 움직이는 시간 단위
  • 해석해야 할 명령어
    • 명령어 레지스터에서 불러와 해석한 뒤 제어신호 생성
  • 플래그 값
    • 플래그 레지스터에서 불러와 이를 참고하여 제어 신호 생성
  • 제어 신호
    • 시스템 버스, 특히 제어 버스로 전달된 신호를 받아들임

제어장치가 내보내는 정보

  • CPU 외부에 전달하는 제어 신호
    • 제어 버스로 제어 신호를 내보냄
    • 메모리에 전달하는 제어 신호
      • 메모리의 값을 읽거나 새로운 값을 쓸 때 내보내는 신호
    • 입출력장치(보조기억장치 포함)에 전달하는 제어 신호
      • 입출력장치의 값을 읽거나 새로운 값을 쓸 때 내보내는 신호
  • CPU 내부에 전달하는 제어 신호
    • ALU에 전달하는 제어 신호
      • 수행할 연산을 지시할 때 내보내는 신호
    • 레지스터에 전달하는 제어 신호
      • 레지스터 간 데이터를 이동시킬 때 내보내는 신호
      • 레지스터에 저장된 명령어를 해석할 때 내보내는 신호

04-2 레지스터

프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다.

반드시 알아야 할 레지스터

  1. 프로그램 카운터(Program Counter, PC)
    1. 메모리에서 읽어올 명령어 주소 저장
    2. 명령어 포인터(Instruction Pointer, IP)라고도 함
  2. 명령어 레지스터(Instruction Register, IR)
    1. 메모리에서 읽어온 명령어를 저장
    2. 제어장치가 이곳의 명령어를 가져가 해석한 뒤 제어 신호 발생
  3. 메모리 주소 레지스터(Memory Address Register, MAR)
    1. 메모리의 주소 저장
    2. CPU가 주소 버스에 보내는 값이 거치는 레지스터
  4. 메모리 버퍼 레지스터(Memory Buffer Register, MBR)
    1. 메모리와 주고받을 데이터와 명령어 저장
    2. CPU가 데이터 버스에 보내는 값이 거치는 레지스터
  5. 플래그 레지스터
    1. 연산 결과 또는 CPU 상태에 대한 부가적인 정보 저장
  6. 범용 레지스터(general purpose register)
    1. 데이터와 주소 모두 저장 가능
    2. CPU 안에 여러 개 존재
  7. 스택 포인터
  8. 베이스 레지스터

메모리에 저장된 프로그램 실행 과정

  1. 프로그램 카운터에 프로그램이 저장된 메모리의 주소(A) 저장
  2. 메모리 주소 레지스터에 A를 저장
    1. 주소 버스로 A를 내보내기 위함
  3. 메모리 주소 레지스터 값(A)을 주소 버스를 통하여 메모리로 전달
    메모리 읽기 제어 신호를 제어 버스를 통하여 메모리로 전달
  4. 메모리의 A 주소에 저장된 값(B)이 데이터 버스를 통해 메모리 버퍼 레지스터로 전달
  5. 프로그램 카운터 증가
    1. 이는 다음 명령어를 읽을 준비 작업
    2. 프로그램 카운터가 증가해야 프로그램을 순차적으로 실행할 수 있다.
      1. JUMP, CALL 등의 명령어가 실행되는 경우 또는 인터럽트가 발생한 경우, 프로그램은 순차적으로 실행되지 않는다.
  6. 메모리 버퍼 레지스터에 저장된 값(B)이 명령어 레지스터로 이동
  7. 제어장치가 명령어 레지스터의 B 명령어를 해석하고 제어 신호 발생

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

스택 주소 지정 방식

  • 스택과 스택 포인터를 이용한 주소 지정 방식
  • 스택 포인터: 스택에 마지막으로 저장된 값의 위치를 가리키는 레지스터
    • 스택의 어디까지 데이터가 채워져 있는지에 대한 표시
  • 스택 영역: 스택처럼 사용하기로 암묵적으로 약속된 메모리 영역

변위 주소 지정 방식

  • 유효 주소 = 오퍼랜드 필드의 값(변위) + 특정 레지스터의 값
  • 변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드를 포함
    • 레지스터 필드의 값과 오퍼랜드 필드의 값을 더해 유효 주소 도출

상대 주소 지정 방식

  • relative addressing mode
  • 유효 주소 = 오퍼랜드 필드의 값 + 프로그램 카운터의 값
    • 프로그램 카운터 ⇒ 실행할 명령어 주소
    • 오퍼랜드 ⇒ 실행할 명령어로부터 떨어진 거리
  • 실행할 명령어로부터 오퍼랜드만큼 떨어진 주소로 이동하게 된다.
  • if문처럼 분기하여 특정 코드를 실행할 때 사용

베이스 레지스터 주소 지정 방식

  • base-register addressing mode
  • 유효 주소 = 오퍼랜드 필드의 값 + 베이스 레지스터의 값
    • 베이스 레지스터 ⇒ 기준 주소
    • 오퍼랜드 ⇒ 기준 주소로부터 떨어진 거리
  • 기준 주소로부터 오퍼랜드만큼 떨어진 주소로 이동하게 된다.

04-3 명령어 사이클과 인터럽트

명령어 사이클

  • 명령어 사이클: 하나의 명령어가 처리되는 주기
  • 인출 사이클(fetch cycle)
    • 메모리에 있는 명령어를 CPU로 가져오는 단계
  • 실행 사이클(execution cycle)
    • CPU로 가져온 명령어를 실행하는 단계
    • 제어장치가 명령어 레지스터에 담긴 값 해석 → 제어 신호 발행
  • 간접 사이클(indirect cycle)
    • 실행 사이클에 돌입하기 전, 피연산자 주소를 찾기 위해 메모리 접근이 더 필요한 경우 실행되는 단계
  • 인터럽트 사이클(interrupt cycle)
    • 실행 사이클이 끝나고 인터럽트가 발생한 경우 실행되는 단계

인터럽트

  • 인터럽트: CPU 작업을 방해하는 신호
  • 동기 인터럽트(예외, exception)
    • CPU에 의해 발생
    • CPU가 실행하는 프로그래밍 상의 오류 등
  • 비동기 인터럽트(인터럽트, 하드웨어 인트럽트)
    • 주로 입출력장치에 의해 발생

하드웨어 인터럽트

하드웨어 인터럽트가 있기 때문에 CPU는 작업 완료를 기다릴 필요 없이, 입출력 작업 중에도 다른 명령어를 처리할 수 있다.

인터럽트 처리 순서

  1. 입출력장치가 CPU에 인터럽트 요청 신호 전송
  2. CPU는 인터럽트 요청을 확인
    1. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전, 항상 인터럽트 여부를 확인
  3. 인터럽트 플래그를 통해 인터럽트를 받아들일 수 있는지 확인
    1. CPU가 중요한 작업 중이라 인터럽트가 불가하다고 설정되어 있다면 인터럽트 요청 무시
    2. 하드웨어 인터럽트에는 정전, 하드웨어 고장 등 인터럽트 플래그가 무시할 수 없는 인터럽트(non maskable interrupt)도 존재
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 스택에 백업
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴 실행
    1. 인터럽트 서비스 루틴(ISR, 인터럽트 핸들러)
      1. 인터럽트에 대한 처리와 작동 방식으로 이루어진 프로그램(명령어와 데이터)
      2. 메모리에 여러 개의 인터럽트 서비스 루틴이 저장되어 있음
    2. 인터럽트 벡터
      1. 인터럽트 서비스 루틴을 식별하기 위한 정보
      2. 인터럽트 서비스 루틴의 시작 주소를 담고 있음
      3. 하드웨어 인터럽트 요청을 보낸 대상이 데이터 버스를 통해 CPU로 인터럽트 벡터 전달
  6. 인터럽트 서비스 루틴 실행이 끝나면 스택에 백업해둔 작업을 복구하여 재실행

예외의 종류

예외가 발생하면 CPU는 하던 일을 중단하고 예외를 처리한 뒤, 본래 작업으로 돌아온다.

  • 폴트(fault)
    • 예외 처리 후, 예외가 발생한 명령어부터 실행 재개
  • 트랩(trap)
    • 예외 처리 후, 예외가 발생한 명령어의 다음 명령어부터 실행 재개
    • 주로 디버깅에 사용
  • 중단(abort)
    • CPU가 실행 중인 프로그램을 강제로 중단해야 하는 심각한 오류를 발견한 경우 발생
  • 소프트웨어 인터럽트(software interrupt)
    • 시스템 호출이 발생했을 때 생기는 예외
This post is licensed under CC BY 4.0 by the author.