학습 목표
•
ALU와 제어장치
•
레지스터의 종류와 역할
•
명령어 사이클
•
인터럽트
ALU와 제어장치
Recall) ALU와 제어장치는 CPU의 구성요소이다
ALU
플래그
연산 결과에 대한 추가적인 정보
플래그 종류 | 의미 | 사용 예시 |
부호 플래그 | 연산한 결과의 부호 | 1: 음수, 0: 양수 |
제로 플래그 | 연산 결과가 0인지 아닌지 | 1: 결과가 0, 0: 0이 아님 |
캐리 플래그 | 연산 결과 올림수나 빌림수가 발생했는 지 | 1: 올림수나 빌림수 발생, 0: 아님 |
오버플로우 플래그 | 오버플로우가 발생했는지 | 1: 오버플로우 발생, 0: 아님 |
인터럽트 플래그 | 인터럽트가 가능한지 | 1: 인터럽트가 가능, 0: 불가능 |
슈퍼바이저 플래그 | 커널 모드(vs 사용자 모드)로 실행중인지 | 1: 커널 모드 실행 중, 0: 사용자 모드 |
플래그는 플래그 레지스터라고 불리는 레지스터에 저장
제어장치
명령어를 해석하고 제어 신호를 보내는 부품
받아들이는 신호
1.
제어장치는 클럭 신호를 받아들인다
a.
하나의 명령어가 여러 클럭에 거쳐 실행될 수 있다
2.
제어장치는 ‘해석해야 할 명령어’를 받아들인다
a.
CPU가 해석해야 할 명령어는 명령어 레지스터라고 불리는 특별한 레지스터에 저장되어있다
b.
제어장치는 여기서 명령어를 받아 읽고 해석하고, 제어 신호를 발생시킨다
3.
제어장치는 플래그 레지스터 속 플래그 값을 받아들인다
a.
ALU 연산 추가 정보 당연히 필요
4.
제어장치는 시스템 버스, 그 중에서 제어 버스로 전달된 제어 신호를 받아들인다
a.
외부로부터 제어 신호를 받아들이기도 한다
내보내는 신호
1.
CPU 외부로 전달하는 신호 (제어 버스로 제어 신호를 내본다는 말과 동치)
a.
메모리에 전달하는 제어 신호
메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶을 때
b.
입출력장치(와 보조기억장치)에 전달하는 제어 신호
2.
CPU 내부로 전달하는 신호
a.
ALU에 전달하는 제어 신호
수행할 연산을 지시
b.
Register에 전달하는 제어 신호
레지스터 간 데이터 이동 및 레지스터에 저장된 명령어를 해석하기 위해
레지스터
프로그램 카운터, 명령어 레지스터, 메모리 주소, 버퍼 레지스터, 범용 레지스터, 플래스 레지스터, 스택 포인터, 베이스 레지스터
반드시 알아야 할 레지스터 8개
프로그램 카운터
PC, Program Counter
•
메모리에서 가져올 명령어의 주소 저장
•
프로그램 카운터를 명령어 포인터(IP, Instruction Pointer)라고 부르는 CPU도 있다
명령어 레지스터
IR, Instruction Register
•
방금 메모리에서 읽어드린, 해석의 대상이 되는 명령어를 저장하는 레지스터
•
제어장치는 명령어 레지스터 속 명령어를 받아들이고, 이를 해석해서 제어신호를 보낸다
메모리 주소 레지스터
MAR, Memory Address Register
•
메모리의 주소를 저장하는 레지스터
•
CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낸 때 메모리 주소 레지스터를 거친다
메모리 버퍼 레지스터
MBR, Memory Buffer Register
•
메모리와 주고 받을 값(데이터, 명령어)을 저장하는 레지스터
◦
메모리에 쓰고 싶은 값
◦
메모리로부터 전달받은 값
•
CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고 받을 값은 메모리 버퍼 레지스터를 거친다
•
MRD, Memory Data Register라고도 불린다
메모리에 저장된 프로그램을 실행하는 과정에서 레지스터 관찰
1
2
3
4
5
6
PC의 순차적 증가
일반적으로는 PC = PC + 1 이 수행되지만, JUMP, CONDITIONAL JUMP, CALL, RET 등 특정 메모리 주소로 실행 흐름을 이동하는 명령어가 실행되면 프로그램을 차례대로 수행되지 않는다. 이 경우 PC에는 변경된 주소가 저장된다
범용 레지스터
General Purpose Register
•
다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
•
데이터와 주소 모두를 저장할 수 있다
◦
참고로, 메모리 주소 레지스터는 주소만, 메모리 버퍼 레지스터는 데이터만 저장한다
•
일반적으로 CPU 안에는 여러 개의 범용 레지스터가 있다
플래그 레지스터
Flag Register
•
ALU 연산 결과에 따른 플래그를 저장하는 곳
•
연산 결과, 혹은 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터
특정 레지스터를 이용한 주소 지정 방식
스택 주소 지정 방식
스택과, 스택 포인터를 이용한 주소 지정 방식
•
스택 포인터: 스택의 꼭대기를 가리키는 레지스터
•
어디까지 데이터가 채워져 있는가?
•
스택: 메모리 안의 스택 영역에 존재
◦
다른 주소 공간과 다르게 스택처럼 사용하기로 암묵적으로 약속
변위 주소 지정 방식
Displacement Addressing Mode
•
오퍼랜드에 메모리 주소를 직접 담는 방법의 변형
•
오퍼랜드의 값(변위) + 특정 레지스터의 값 = 유효 주소
•
오퍼랜드 필드 주소, 레지스터의 종류에 따라 종류가 나뉜다
◦
상대 주소 지정 방식
◦
베이스 레지스터 주소 방식
상대 주소 지정 방식
Relative Addressing Mode
•
오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식
•
프로그래밍 언어의 if문과 유사하게 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용
베이스 레지스터 주소 지정 방식
Base-Register Addressing Mode
•
오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식
◦
베이스 레지스터: 기준 주소
◦
오퍼랜드: 기준 주소로부터 떨어진 거리
명령어 사이클과 인터럽트
명령어 사이클, 인터럽트, 예외, 하드웨어 인터럽트, 인터럽트 서비스 루틴
•
명령어 사이클: 하나의 명령어를 처리하는 정형화된 흐름
•
인터럽트: 이런한 흐름이 끊어지는 상황
명령어 사이클
Instruction Cycle
•
프로그램 = 수많은 명령어
•
각각의 명령어들은 일정한 주기로 실행 → 명령어 사이클
1.
인출 사이클 (Fetch Cycle)
•
명령어를 메모리에서 CPU로 가져오는 단계
2.
실행 사이클 (Execution Cycle)
•
제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계
•
간접 사이클
◦
명령어를 CPU로 가져왔다 해도 추가적인 메모리 접근 필요할 수도
◦
ex) 간접 주소 지정 방식
인터럽트
CPU의 작업을 방해하는 신호
인터럽트 = 동기 인터럽트 + 비동기 인터럽트
동기 인터럽트
Synchronous Interrupts
•
CPU에 의해 발생하는 인터럽트
•
CPU가 실행하는 프로그래밍 상 오류와 같은 예외적인 상황에 발생
•
Exception과 동치
비동기 인터럽트
Asynchronous Interrupts
•
주로 입출력장치에 의해 발생하는 인터럽트
•
CPU의 요청을 다 끝낸 입출력장치가 보내는 완료 알림
•
마우스, 키보드
•
일반적으로 비동기 인터럽트 = 인터럽트
◦
이 책에선 혼동을 방지하기 위해 하드웨이 인터럽트라는 용어로 사용
하드웨어 인터럽트 처리 순서
알림과 같은 인터럽트
1.
입출력 장치는 CPU에 인터럽트 요청 신호를 보낸다
2.
CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인
3.
CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인
4.
인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업
5.
CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
6.
인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해 둔 작업을 복구하여 실행을 재개
키워드
•
인터럽트 요청 신호
•
인터럽트 플래그
◦
하드웨어 인터럽트를 받아들일지, 무시할 지 결정하는 플래그
◦
CPU가 중요한 작업을 처리해야 하거나, 방해받지 않아야 할 경우 불가능으로 설정
◦
플래그가 불가능이어도 막을 수 없는 인터럽트도 있따 ← 정전, 하드웨어 고장 등
•
인터럽트 서비스 루틴
◦
ISR, Interrupt Service Routine
◦
Interrupt Handler 라고도 불린다
◦
인터럽트를 처리하기 위한 프로그램
◦
인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램
▪
키보드가 어떤 인터럽트 요청을 보냈을 때는 어떻게 작동한다
CPU가 인터럽트를 처리한다 = 인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 다시 되돌아온다
•
인터럽트 벡터
Interrupt Vector
◦
수많은 인터럽트 서비스 루틴을 구분하기 위해 인터럽트 백터를 사용
◦
인터럽트 벡터는 서비스 루틴을 식별하기 위한 정보
◦
인터럽트 벡터를 알면 서비스 루틴의 시작 주소를 알 수 있다
CPU는 하드웨어 인터럽트 요청을 보낸 대상으로부터 데이터 버스를 통해 인터럽트 벡터를 전달받는다
ex) CPU가 작업 도중 키보드 인터럽트가 발생한 경우
→ CPU는 인터럽트 벡터를 참조하여 키보드 서비스 루틴 시작 주소를 알아내고
→ 이 시작주소로부터 실행해 나가며 키보드 인터럽트 서비스 루틴을 실행
예외의 종류
폴트 vs 트랩
•
폴트 (Fault): 예외를 처리한 직후, 예외가 발생한 명령어부터 실행을 재개
◦
명령어를 실행하는 데 필요한 데이터가 메모리가 아닌 보조기억장치에 있는 경우
◦
CPU는 폴트를 발생시키고 보조기억장치로부터 메모리로 데이터를 가져온 후 재개
◦
실행하려고 했던 명령어를 당연히 다시 실행해야함
•
트랩 (Trap): 예외를 처리한 직후, 예외가 발생한 명령어의 다음 명령어부터 실행을 재개
◦
주로 디버깅 목적으로 실행
◦
“이 코드가 실행되는 순간 잠깐 진행을 멈춰!” 라는 명령어
◦
트랩 처리가 끝나면 (디버깅이 끝나면) 다음 명령어부터 실행 돼야
중단
•
CPU가 실행 중인 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류를 발견했을 때 발생
소프트웨어 인터럽트
•
시스템 호출이 발생했을 때 나타남