[혼공컴운] ch.4 CPU의 작동 원리

제트·2024년 7월 13일
0

4-1. ALU와 제어장치

1. ALU

  • 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들임.

  • ALU는 레지스터와 제어장치로부터 받아들인 피연산자와 제어 신호로 산술연산, 논리 연산 등 다양한 연산을 수행

  • ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장하는 이유 : CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느림. ALU가 연산할 때마다 결과를 메모리에 저장하면 당연하게 CPU는 메모리에 자주 접근하게 되고, 이로 CPU는 프로그램 실행 속도를 늦출 수 있기 때문.

  • ALU는 계산 결과와 함께 플래그를 내보냄

    • 플래그 : 연산 결과에 대한 추가적인 상태 정보(결과가 음수, 결과가 레지스터보다 크다.)

    • 오버플로우(overflow) : 연산 결과가 연산 결과를 담을 레지스터보다 큰 상황

    • ALU가 내보내는 플래그 종류

      • 부호 플래그 : 연산 결과의 부호 나타냄(1이면 음수, 0이면 양수)
      • 제로 플래그 : 연산 결과가 0인지 아닌지(1이면 연산 결과 0, 0이면 0이 아님)
      • 캐리 플래그 : 연산 결과 올림수, 빌림수 발생했는지(1이면 발생, 0이면 발생하지 않음)
      • 오버플로우 플래그 : 오버플로우 발생 여부(1이면 발생, 0이면 발생하지 않음)
      • 인터럽트 플래그 : 인터럽트가 가능한지(1이면 가능, 0이면 불가능)
      • 슈퍼바이저 플래그 : 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지 판단(1이면 커널모드, 0이면 사용자 모드)
  • 플래그 레지스터 : 플래그가 저장되는 레지스터

2. 제어장치

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

  • 제어장치가 받아들이는 정보
    [1] 클럭 신호

  • 클럭(clock) : 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
    [2] 해석해야 할 명령어

  • 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려줌
    [3] 플래그 레지스터 속 플래그 값

  • 플래그 값을 받아들이고 참고해 제어 신호를 발생시킴
    [4] 시스템 버스 중에서 제어 버스로 전달된 제어 신호

  • 제어 장치는 CPU 내/외부로 제어 신호를 내보냄

    • 제어 신호에는 메모리에 전달하는 신호와 입출력장치에 전달하는 신호가 있음

4-2. 레지스터

1. 반드시 알아야 할 레지스터

1) 프로그램 카운터(PC, Program Counter)

  • 메모리에서 가져올 명령어의 주소(명령어에서 읽어 들일 명령어의 주소) 저장. 명령어 포인터(IP, Instruction Pointer)라고도 함

2) 명령어 레지스터(IR, Instruction Register)

  • 해석할 명령어(방금 메모리에서 읽어들인 명령어)를 저장

3) 메모리 주소 레지스터(MAR, Memory Address Register)

  • 메모리의 주소 저장. CPU가 읽어들이고자 하는 주소 값을 주소 버스로 보낼 때 거침

4) 메모리 버퍼 레지스터(MBR, Memory Buffer Register)

  • 메모리와 주고받을 값(데이터, 명령어)을 저장. 메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값이 거치게 됨
  • CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 ㅂ스로 주고 받을 값은 메모리 버퍼 레지스터를 거침

5) 범용 레지스터(general purpose register)

  • 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
  • 데이터와 주소를 모두 저장할 수 있음

6) 플래그 레지스터(flag register)

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

2. 특정 레지스터를 이용한 주소 지정 방식(1) : 스택 주소 지정 방식

1) 주소 지정 방식 종류

  • 스택 포인터는 스택 주소 지정 방식이라는 주소 지정 방식에 사용
  • 프로그램 카운터, 베이스 레지스터는 변위 주소 지정 방식이라는 주소 지정 방식에 사용

2) 스택 주소 지정 방식

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

3. 특정 레지스터를 이용한 주소 지정 방식(2) : 변위 주소 지정 방식

1) 변위 주소 지정 방식(displacement addressing mode)

  • 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더해 유효 주소를 얻어내는 방식
  • 명령어 : 연산 코드, 레지스터, 오퍼랜드 필드
  • 이 때, 오퍼랜드 필드 주소와 어떤 레지스터를 더하느냐에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등으로 나뉨

(1) 상대 주소 지정 방식(relative addressing mode)

  • 오퍼랜드 + 프로그램 카운터 = 유효주소

(2) 베이스 레지스터 주소 지정 방식(base-register addressing mode)

  • 오퍼랜드 + 베이스 레지스터 = 유효 주소
    (베이스 레지스터 : 기준 주소, 오퍼랜드 : 기준 주소로부터 떨어진 거리)

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

1. 명령어 사이클

  • 명령어 사이클(instruction cycle) : 프로그램 속 각각의 명령어들이 일정한 주기를 반복하며 실행되는 사이클
  • 인출 사이클(fetch cycle) : 메모리에 있는 명령어를 CPU로 가지고 오는 단계
  • 실행 사이클(execution cycle) : CPU로 가져온 명령어를 실행하는 단계
  • 간접 사이클(indirect cycle) : 명령어를 바로 인출할 수 없을 때 메모리 접근을 더 하는 방식

2. 인터럽트

  • 인터럽트(interrupt) : CPU의 작업을 방해하는 신호
  • 인터럽트의 종류 : 동기 인터럽트, 비동기 인터럽트
    • 동기 인터럽트 : CPU에 의해 발생하는 인터럽트. 예상치 못한 상황에 마주쳤을 때 발생. 예외(exception)라고 부름
    • 비동기 인터럽트 : 입출력장치에 의해 발생하는 인터럽트. 알림 역할. (교재에서는 하드웨어 인터럽트 용어 사용)
      /
  • 하드웨어 인터럽트 처리 순서
    (1) 입출력 장치는 CPU에 인터럽트 요청 신호 보냄
    (2) CPU는 실행 사이클 끝나고 명령어 인출 전 항상 인터럽트 여부 확인
    (3) 인터럽트 여부 확인하고 CPU는 인터럽트 플래그 통해 인터럽트 받아 들일 수 있는지 상태 확인
    (4) 인터럽트 받아들일 수 있으면 CPU는 지금까지의 작업 백업
    (5) CPU는 인터럽트 벡터 참조해 인터럽트 서비스 루틴 실행
    (6) 인터럽트 서비스 루틴 실행 끝나면 (4)에 백업해둔 작업 복구해 실행 재개

+) 용어

  1. 인터럽트 요청 신호
  • 끼어들어도 되는지 CPU에 물어보는 것
  1. 인터럽트 플래그
  • 하드웨어 인터럽트를 받을지 무시할지 결정
  • 설정이 '불가능'(방해 받지 않아야 할 때) : 인터럽트 요청와도 무시
  • 설정이 '가능' : 인터럽트 요청 수락
  • 막을 수 있는 인터럽트, 막을 수 없는 인터럽트가 있음
  1. 인터럽트 서비스 루틴
  • 인터럽트를 처리하기 위한 프로그램. 인터럽트 핸들러라고도 부름
  1. 인터럽트 벡터
  • 인터럽트 서비스 루틴을 식별하기 위한 정보. 인터럽트 서비스 루틴의 시작 주소를 알 수 있음

/

예외의 종류

1. 폴트

  • 예외를 처리한 직후 예외가 발생한 명령어부터 실행 재개

2. 트랩

  • 예외 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행 재개. 디버깅할 때 사용(디버깅 : 프로그램 개발 중 발생한 문제를 진단하고 해결하기 위한 작업)

3. 중단

  • CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류 발견했을 때

4. 소프트웨어 인터럽트

  • 시스템 호출이 발생했을 때 발생

/

2주차 기본 과제
Q. 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워라.
A.
1) 플래그 레지스터 : 연산 결과 혹은 CPU 상태에 대한 부가 정보 저장하는 레지스터
2) 프로그램 카운터 : 메모리에서 가져올 명령어의 주소 저장하는 레지스터
3) 범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터
4) 명령어 레지스터 : 해석할 명령어를 저장하는 레지스터

profile
소프트웨어학부 2학년

0개의 댓글