컴퓨터구조론#3
LeeMir, 22 March 2021
2장 - CPU의 구조와 기능
CPU의 기본 구조
- CPU의 기능
- 모든 명령어들에 대하여 공통적으로 수행
- 명령어 인출 : 기억장치로부터 명령어를 읽어온다
- 명령어 해독 : 수행해야 할 동작을 결정하기 위하여 명령어를 해독한다
- 명령어에 따라 필요한 경우에만 수행
- 데이터 인출 : 명령어 실행을 위하여 데이터가 필요한 경우에는 기억장치 혹은 I/O 장치로부터 그 데이터를 읽어온다
- 데이터 처리 : 데이터에 대한 산술적 혹은 논리적 연산을 수행
- 데이터 저장 : 수행한 결과를 저장
- 모든 명령어들에 대하여 공통적으로 수행
- CPU의 내부 구성요소
- ALU(산술논리연산장치)
- 각종 산술 연산들과 논리 연산들을 수행하는 회로들로 이루어진 하드웨어 모듈
- 산술 연산 : + - * /
- 논리 연산 : AND OR NOT XOR
- 레지스터 세트
- 액세스 속도가 가장 빠른 기억장치
- CPU 내부에 포함할 수 있는 레지스터들의 수가 제한됨(특수 목적용 레지스터들과 적은 수의 일반 목적용 레지스터들)
- 일반 목적용 레지스터 = 범용 레지스터
- 제어 유닛
- 프로그램 코드(명령어)를 해석하고, 그것을 실행하기 위한 제어 신호들을 순차적으로 발생하는 하드웨어 모듈
- CPU 내부 버스
- ALU와 레지스터들 간의 데이터 이동을 통한 데이터 선들과 제어 유닛으로부터 발생되는 제어 신호 선들로 구성된 내부 버스
- 외부의 시스템 버스들과는 직접 연결되지 않으며, 반드시 버퍼 레지스터들 혹은 시스템 버스 인터페이스 회로를 통하여 시스템 버스와 접속
- ALU(산술논리연산장치)
명령어 실행
-
명령어 사이클 : CPU가 한 개의 명령어를 실행하는 데 필요한 전체 처리 과정으로서, CPU가 프로그램 실행을 시작한 순간부터 전원을 끄거나 회복 불가능한 오류가 발생하여 중단될 때까지 반복
- 두 개의 부사이클들로 분리
- 인출 사이클 : CPU가 기억장치로부터 명령어를 읽어오는 단계
- 실행 사이클 : 명령어를 실행하는 단계
- 명령어 실행에 필요한 CPU 내부 레지스터들
- 프로그램 카운터(Program Counter : PC)
- 다음에 인출할 명령어의 주소를 가지고 있는 레지스터
- 각 명령어 인출된 후에는 자동적으로 일정 크기만큼 증가
- 분기 명령어가 실행되는 경우에는 목적지 주소로 갱신
- 누산기(Accumulator : AC)
- 데이터를 일시적으로 저장하는 레지스터
- 레지스터의 길이는 CPU가 한 번에 처리할 수 있는 데이터 비트 수(단어 길이)와 동일
- 명령어 레지스터(Instruction Register : IR)
- 가장 최근에 인출된 명령어 코드가 저장되어 있는 레지스터
- 기억장치 주소 레지스터(Memory Address Register : MAR)
- PC에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터
- 기억장치 버퍼 레지스터(Memory Buffer Register : MBR)
- 기억장치에 쓰여질 데이터 혹은 기억장치로부터 읽혀진 데이터를 일시적으로 저장하는 버퍼 레지스터
- 프로그램 카운터(Program Counter : PC)
-
인출 사이클
-
-
프로그램 카운터가 가리키는 주소를 MAR에 저장
-
그 주소가 지정하는 기억장치 위치로부터 읽혀진 명령어가 데이터 버스를 통하여 MBR로 적재됨
ㄴ이 때, 프로그램 카운터가 +1됨
-
MBR에 있는 명령어 코드가 명령어 레지스터인 IR로 이동
-
- CPU 클록 = 1GHz(클럭 주기 = 1ns)일 경우, 인출 사이클에는 각 주기가 한번씩 돌아서 총 3ns가 소요됨
-
-
실행 사이클
- CPU는 실행 사이클 동안 명령어 코드를 해독하고, 그 결과에 따라 필요한 연산들을 수행함
- CPU가 수행하는 연산들의 종류
- 데이터 이동 : CPU와 기억장치 간 혹은 I/O장치 간에 데이터를 이동
- 데이터 처리 : 데이터에 대하여 산술 혹은 논리 연산을 수행
- 데이터 저장 : 연산 결과 데이터 혹은 입력장치로부터 읽어 들인 데이터를 기억장치에 저장
- 프로그램 제어 : 프로그램의 실행 순서를 결정
- 실행 사이클에서 수행되는 마이크로 연산들은 명령어의 연산 코드(op code)에 따라 결정됨
- 기본적인 명령어 형식의 구성
- 연산 코드 : CPU가 수행할 연산을 지정(연산자)
- 오퍼랜드 : 명령어 실행에 필요한 데이터(피연산자)가 저장된 주소
- LOAD addr 명령어
-
- 명령어 레지스터 IR에 있는 명령어의 주소 부분을 MAR로 전송
- 그 주소가 지정한 기억장소들로부터 데이터를 인출하여 MBR로 전송
- 그 데이터를 AC에 적재
-
- STA addr 명령어(STORE)
-
- IR에서 데이터를 저장할 기억장치의 주소를 MAR로 전송
- 저장할 데이터(AC)를 버퍼 레지스터인 MBR로 이동
- MBR의 내용을 MAR이 지정하는 기억장소에 저장
-
- ADD addr 명령어
-
- IR에서 데이터가 저장되어있는 기억장치의 주소를 MAR로 전송
- 연산할 데이터를 버퍼 레지스터인 MBR로 이동
- ALU에서 그 데이터와 AC의 내용을 더하고 결과값을 다시 AC에 저장
-
- JUMP addr 명령어
-
- IR에 저장되어있는 주소(분기할 목적지의 주소)를 PC에 저장
-
인터럽트 사이클
- 인터럽트 : 프로그램 실행 중에 CPU의 현재 처리 순서를 중단시키고 다른 동작을 수행하도록 요구하는 시스템 동작
- 외부로부터 인터럽트 요구가 들어오면
- CPU는 원래의 프로그램 수행을 중단하고
- 요구된 인터럽트를 위한 서비스 프로그램을 먼저 수행
- 인터럽트 서비스 루틴(Interrupt Service Routine : ISR) : 인터럽트를 처리하기 위하여 수행되는 프로그램 루틴
- 인터럽트 처리 과정
- 인터럽트가 들어왔을 때 CPU는
- 어떤 장치가 인터럽트를 요구했는지 확인하고, 해당 ISR을 호출
- 서비스가 종료된 다음에는 중단되었던 원래 프로그램의 수행을 계속함
- CPU 인터럽트 처리의 세부 동작
- 현재의 명령어 실행을 끝낸 즉시, 다음에 실행할 명령어의 주소(PC)를 스택(Stack)에 저장 => 일반적으로 스택은 주기억장치의 특정 부분
- ISR을 호출하기 위하여 그 루틴의 시작 주소를 PC에 적재. 이때 시작 주소는 인터럽트를 요구한 장치로부터 전송되거나 미리 정해진 값으로 결정
- 인터럽트가 들어왔을 때 CPU는
- 인터럽트 사이클의 마이크로 연산
-
- PC의 내용을 MBR로 전송
- SP(Stack Pointer)의 내용을 MAR로 전송하고, PC의 내용은 인터럽트 서비스 루틴의 시작 주소로 변경
- MBR에 저장되어 있던 원래 PC의 내용을 스택에 저장
-
- 다중 인터럽트
- 인터럽트 서비스 루틴을 수행하는 동안에 다른 인터럽트 발생
- 다중 인터럽트의 처리 방법
- CPU가 인터럽트 서비스 루틴을 처리하고 있는 도중에는 새로운 인터럽트 요구가 들어오더라도 인터럽트 사이클을 수행하지 않는 방법
- 인터럽트 플래그 <= 0 : 인터럽트 불가능 상태
- 시스템 운영상 중요한 프로그램이나 도중에 중단할 수 없는 데이터 입출력 동작 등을 위한 인터럽트를 처리하는데 사용
- 인터럽트의 우선순위를 정하고, 우선순위가 낮은 인터럽트가 처리되고 있는 동안에 우선순위가 더 높은 인터럽트가 들어온다면, 현재의 인터럽트 서비스 루틴의 수행을 중단하고 새로운 인터럽트를 처리
- CPU가 인터럽트 서비스 루틴을 처리하고 있는 도중에는 새로운 인터럽트 요구가 들어오더라도 인터럽트 사이클을 수행하지 않는 방법
간접 사이클
- 명령어에 포함되어 있는 주소를 이용하여, 그 명령어 실행에 필요한 데이터의 주소를 인출하는 사이클
- 간접 주소지정 방식에서 사용
- 인출 사이클과 실행 사이클 사이에 위치
- 간접 사이클의 마이크로 연산
-
- MAR <= IR(addr)
- MBR <= M[MBR]
- IR(addr) <= MBR
- 인출된 명령어의 주소 필드 내용을 이용하여 기억장치로부터 데이터의 실제 주소를 인출하여 IR의 주소 필드에 저장
-