컴퓨터 공학/컴퓨터 구조

[혼공컴운] chapter.04 CPU의 작동원리

hhzinistic 2023. 7. 15. 21:14

 

 

2023.07.06 - [컴퓨터 공학/컴퓨터 구조] - [혼공컴운] chapter.03 명령어

 

[혼공컴운] chapter.03 명령어

2023.07.06 - [컴퓨터 공학/컴퓨터 구조] - [혼공컴운] chapter.02 데이터 [혼공컴운] chapter.02 데이터 이전글 - 2023.07.06 - [컴퓨터 공학/컴퓨터 구조] - [혼공컴운] chapter.01 컴퓨터 구조 시작하기 02-1 0과 1로

zinistic.tistory.com

 

 

 

04-1 ALU와 제어장치

  • ALU(Arithmetic and Logit Unit, 산술논리연산장치)
    : 산술 연산들과 논리 연산들을 수행하는 회로들로 이루어진 하드웨어 모듈
    ALU는 레지스터를 통해 피연산자를 받고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받음.
    연산을 수행한 후 ALU는 결과값플래그 값을 출력함
    • 플래그(flag): 연산 결과에 대한 추가적인 상태 정보. 플래그 레지스터에 저장됨.

      <ALU가 내보내는 대표적인 플래그 종류>
      1. 부호 플래그 (S) : 연산한 결과의 부호를 나타낸다.
        → 부호플래그 1 => 계산 결과 음수. 부호플래그 1 => 계산 결과 양수
      2. 제로 플래그 (Z) : 연산 결과가 0인지 여부를 나타낸다.
        → 제로플래그 1=> 계산 결과 0. 제로플래그 0 => 계산 결과 non- zero.
      3. 캐리 플래그 (C) : 연산 결과가 올림수나 빌림수가 발생하였는지 여부를 나타낸다.
        → 캐리플래그 1 => 올림수 or 빌림수 발생. 캐리플래그 0 => 올림수 or 빌림수 미발생.
      4. 오버플로우 플래그 (V) : 오버플로우 발생 여부를 나타낸다.
        → 오버플로우플래그 1 => 오버플로우 발생. 오버플로우 플래그 0 => 오버플로우 미발생.
      5. 인터럽트 플래그 (I) : 인터럽트 가능 여부를 나타낸다.
        → 인터럽트 플래그 1 => 인터럽트 가능. 인터럽트 플래그 0 => 인터럽트 불가능.
      6. 슈퍼바이저 플래그(P) : 커널 모드 or 사용자 모드 중 어떤 모드를 실행하는지 나타낸다.
        → 슈퍼바이저 플래그 1 => 커널모드 실행중. 슈퍼바이저 플래그 0 => 사용자 모드 실행중.


    • 산술 연산: 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 기본적인 산술 연산들을 말한다. 
      정수들에 대한 연산, 부동소수점 수에 대한 연산도 포함된다.

    • 논리 연산: AND, OR, NOT 연산 등이 있다.

 

 

  • 제어장치(Control Unit, CU)
    : 제어 신호를 내보내고 명령어를 해석하는 부품.

    <제어 장치가 받아들이는 정보>
    • 클럭 신호
      - 클럭(clock): 컴퓨터의 부품이 작동하는 시간 단위.
      * rising edge(상승 에지): 클럭 신호가 0 에서 1로 변화할 때.
      * falling edge(하강 에지): 클럭 신호가 1에서 0으로 변화할 때.

    • 해석해야 할 명령어
      명령어 레지스터로부터 명령어를 받아들이고 해석한 후, 제어 신호를 발생시켜 부품들에 버스를 통해 보낸다.

    • 플래그 레지스터 속 플래그 값
      플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킨다.

    • 제어 버스로 전달된 제어 신호
      CPU 뿐만 아니라 입출력 장치 등 CPU 외부 장치에 대한 제어 신호를 받는다.






04-2 레지스터

 

<레지스터의 종류>

  • 프로그램 카운터(PC; Program Counter)
    : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터.
  • 명령어 레지스터(IR; Instruction Register)
    : 메모리에서 읽어 들인 명령어를 저장하는 레지스터.
  • 메모리 주소 레지스터(MAR; Memory Address Register)
    : 메모리의 주소를 저장하는 레지스터. CPU가 읽고자 하는 주소값은 주소버스를 통해 메모리 주소 레지스터를 거친다.
  • 메모리 버퍼 레지스터(MBR; Memory Buffer Register)
    : 메모리와 데이터와 명령어 값을 저장하는 레지스터. CPU가 데이터 버스로 주고받을 값(데이터 등)은 메모리 버퍼 레지스터를 거친다.
  • 범용 레지스터(general purpose register): 자유롭게 사용할 수 있는 레지스터. 데이터와 주소값 모두를 저장할 수 있다.
  • 플래그 레지스터(flag register): 연산결과 또는 각종 부가적 정보를 저장하는 레지스터.
  • 스택 포인터(stack pointer): 스택의 최상위 주소를 저장하고 있는 레지스터.
    - 메모리 안에 스택처럼 사용할 영역이 지정되어 있다. 이를 스택 영역이라 함.

☆ 영어 약자로 사용하는 경우가 多. 외워둘 것! ☆

 

 

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

  • 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식.
    가장 최근에 저장한 값부터 꺼내어 사용한다.
    스택 영역을 사용하여 다른 주소 공간과는 다르게 스택처럼 사용한다.

 

  • 변위 주소 지정 방식: 오퍼랜드 필드의 값과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식.
    상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등이 있다.

명령어의 형식은 연산코드 레지스터 오퍼랜드로 구성되어 있다.

 

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

 

 

 

 

2. 베이스 레지스터 주소 지정 방식: 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식.
베이스 레지스터값에서 오퍼랜드의 값 만큼 떨어진 거리의 유효 주소를 얻어내는 방식이다.

 

 

 

 

 


 

 

 

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

 

  • 명령어 사이클: 명령어들의 실행 주기
    • 인출 사이클: 매모리에 있는 명령어를 CPU로 가져오는 단계
    • 실행 사이클: CPU로 가져온 명령어를 실행하는 단계
      제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시킴.
    • 간접 사이클: 주소 지정 방식에 따라 메모리 접근이 더 필요한 경우에 거치는 단계.

< 인출 사이클을 3클럭으로 설명한 예>

t0: MAR <- PC
t1: MBR <- M[MAR], PC <- PC + 1
t2: IR <- MBR

 

  • 인터럽트: CPU의 작업을 중단하는 신호.
    • 동기 인터럽트: CPU에 의해 발생하는 인터럽트. 
      프로그래밍상 오류 등 예외적 상황에서 발생. 예외라고도 한다.

      <예외의 종류>
      1. 폴트(fault): 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외.
        ex)명령어를 실행하기 위해 필요한 데이터가 메모리에 없을 때 (캐시 적중 실패) CPU는 폴트를 발생시키고 보조기억장치로부터 필요한 데이터를 메모리로 가져와 저장. 이후 다시 재개
      2. 트랩(trap): 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외.
        ex) 디버깅을 할 때 특정 코드를 실행하는 순간 프로그램 실행을 일시정지하는 것. 디버깅이 끝나면 프로그램은 다음 명령어부터 실행 재개.
      3. 중단(abort): CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없는 오류를 발견할 시 발생하는 예외.
      4. 소프트웨어 인터럽트(software interrupt): 시스템 호출 발생 시 발생하는 예외.
    • 비동기 인터럽트: 주로 입출력장치에 의해 발생하는 인터럽트.
      - 인터럽트 플래그: 인터럽트를 받아들일지 여부를 결정하는 플래그.
      - 인터럽트 서비스 루틴: 인터럽트를 처리하기 위한 프로그램. 인터럽트 핸들러라고도 부름.
      - 인터럽트 벡터: 인터럽트 서비스 루틴을 식별하기 위한 정보.

      <비동기 인터럽트 처리 순서>
      1. 입출력 장치가 CPU에 인터럽트 요청 신호 송신.
      2. CPU는 실행 사이클이 끝나고 인터럽트 여부 확인.
      3. 인터럽트 플래그를 통해 인터럽트 서비스 루틴 실행 가능 여부 확인.
      4. 인터럽트 서비스 루틴 실행 가능 시 현재 작업 정보 백업.
      5. 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴 실행.
      6. 인터럽트 서비스 루틴 실행 종료시 백업해둔 작업 복구 및 실행 재개.

 

* 인터럽트 서비스 루틴의 시작 주소는 인터럽트 벡터를 참조하여 알아낸다.

 

<CPU가 일을 수행하는 과정>

 

 

 

 

 


* 오류 지적은 환영입니다.^^ *