📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.

1. ALU와 제어장치
1-1. ALU
ALU는 계산하는 부품
- 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받는다.
- return 연산한 결괏값 → 레지스터, 플래그 → 플래그 레지스터
- 결괏값은 일시적으로 레지스터에 저장된다. 메모리 노노
- CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리기 때문
- 플래그 : 연산 결과에 대한 추가적인 상태 정보
- 부호 플래그, 제로 플래그, 캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그
- 얘네들이 플래그 레지스터에 다 저장되어 있음
- 이외에도 가산기, 보수기, 시프터, 오버플로우 검출기 등 있음
1-2. 제어장치
제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 부품
제어신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호
제어장치가 받아들이는 정보
- 클럭 신호 : 컴퓨터의 모든 부품이 클럭 신호에 맞춰 작동한다.
- 클럭 : 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
- 현재 수행할 명령어
- 명령어 레지스터에서 해석할 명령어를 받아들이고 해석한 뒤, 제어신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.
- 플래그
- 제어신호
- 시스템 버스 중 제어 버스로 전달된다.
- 제어신호는 CPU 뿐만 아니라 입출력장치 등 외부 장치도 발생시킬 수 있다.
제어장치가 내보내는 정보 : 제어 신호 only.
- CPU 내부에 전달
- ALU
- 레지스터
- 레지스터 간 데이터 이동 / 레지스터에 저장된 명령어를 해석하기 위해
- CPU 외부에 전달
2. 레지스터
2-1. 반드시 알아야 할 레지스터
- 프로그램 카운터
- 메모리에서 읽어들일 명령어의 주소를 저장한다.
- = 명령어 포인터
- 명령어 레지스터
- 메모리 주소 레지스터
- 메모리의 주소 저장
- CPU가 읽어들이고자 하는 주소 값을 주소 버스로 보낼 때 사용
- 메모리 버퍼 레지스터
- 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터
- 메모리에 쓰고싶은 값이나 메모리로부터 전달받은 값
- = 메모리 데이터 레지스터
- 플래그 레지스터
- 연산 결과 또는 CPU 상태에 대한 부가 정보를 저장
- 범용 레지스터
- 데이터와 주소 모두 저장 가능
- CPU에 여러 개 있삼
- 스택 포인터
- 베이스 레지스터
2-2. 특정 레지스터를 이용한 주소 지정 방식
스택 주소 지정 방식
- 스택과 스택 포인터 사용
- 스택 포인터에 저장된 스택 주소 안에 데이터
변위 주소 지정 방식
- 오퍼랜드 필드 값과 특정 레지스터 값을 더하여 유효 주소를 알아낸다.
- 명령어 = 연산 코드 | 레지스터 | 오퍼랜드
- 상대 주소 지정 방식
- 유효 주소 = 프로그램 카운터 + 오퍼랜드
- if문 등 분기 처리할 때 사용
- 베이스 레지스터 주소 지정 방식
3. 명령어 사이클과 인터럽트
3-1. 명령어 사이클
명령어 사이클 : 명령어를 처리하는 일정한 주기
- 인출 사이클
- 실행 사이클
- 명령어 실행 단계 ; 제어장치가 명령어를 해석하고, 제어신호를 발생시키는 단계
- 간접 사이클
- 메모리 접근이 더 필요한 경우 ; 유효 주소 가지러
- 인터럽트 사이클
- 명령어 실행 단계 ; 제어장치가 명령어를 해석하고, 제어신호를 발생시키는 단계

flowchart LR
A[인출 사이클] --> B[실행 사이클]
B[실행 사이클] --> A[인출 사이클]
B[실행 사이클] --인터럽트가 발생한 경우--> D[인터럽트 사이클]
D[인터럽트 사이클] --> A[인출 사이클]
A[인출 사이클] --메모리 접근이 더 필요한 경우--> C[간접 사이클]
C[간접 사이클] --> B[실행 사이클]
3-2. 인터럽트
인터럽트 : CPU 정상적인 작업을 방해하는 신호
- 동기 인터럽트(예외)
- CPU에 의해 발생하는 인터럽트
- Exception
- 폴트(Fault) : 예외 처리 후 예외 발생 명령어부터 실행 재개 ; 페이지 폴트
- 트랩(Trap) : 예외 처리 후 예외 발생 명령어 다음부터 실행 재개 ; 디버깅
- 중단(Abort) : CPU가 실행 중인 프로그램 강제 중단할 만큼 심각한 오류 발견
- 소프트웨어 인터럽트 : 시스템 호출이 발생
- 비동기 인터럽트(하드웨어 인터럽트)
- 입출력장치에 의해 발생하는 인터럽트
- 알림 역할 → CPU는 입출력 작업 중에도 효율적으로 명령어 처리 가능
- 막을 수 있는 인터럽트(maskable interrupt) vs 막을 수 없는 인터럽트(non-maskable interrupt)
하드웨어 인터럽트 처리 순서
- 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
- ask ‘지금 끼어들어도 되나요?’ to CPU
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
- 플래그 레지스터 > 인터럽트 플래그 : 인터럽트를 받아들일지 무시할지 결정하는 비트
- 모든 하드웨어 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아니다.
- 막을 수 없는 인터럽트(non-maskable interrupt) ; 정전, 하드웨어 고장
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴 : 인터럽트를 처리하기 위한 프로그램
- 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지
- 메모리에 각기 다른 인터럽트 서비스 루틴이 저장되어 있다.
- = 인터럽트 핸들러
- 인터럽트 벡터 : 인터럽트 서비스 루틴을 식별하기 위한 정보
- 인터럽트 서비스 루틴의 시작 주소를 알 수 있다.
- CPU는 하드웨어 인터럽트 요청을 보낸 대상으로부터 데이터 버스에 인터럽트 벡터를 전달받음
- 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개한다.