참고 도서: 혼자 공부하는 컴퓨터구조 + 운영체제
섹션 5에 대한 정리.
(ALU, 제어장치, 레지스터, 명령어 사이클, 인터럽트)
📍 ALU
- ALU는 CPU 내부의 계산용 회로이다.
- ALU는 연산을 하기 위해 레지스터로부터 피연산자 + 제어장치로부터 제어신호(수행할 연산)를 받아들인다.
- 결과값은 레지스터에 저장된다. (CPU에 접근하는 것보다 레지스터에 접근하는 게 빠름)
- 플래그는 연산 결과에 대한 부가 정보로(양수/음수인지, 0인지, 연산 결과가 결과를 담을 레지스터에 비해 너무 큰지), 플래그 값은 플래그 레지스터에 저장된다.
📍 제어장치
제어장치가 받아들이는 정보
1. 클럭: 컴퓨터의 시간 단위, 클럭 신호에 맞춰서 명령어들이 수행된다.
2. 해석할 명령어: 명령어 레지스터에 저장되어 있는 명령어
3. 플래그: 플래그 레지스터에 저장되어 있는 값, 해석할 명령어에 대한 부가 정보이므로 반드시 필요하다.
4. 제어 신호
제어장치가 내보내는 정보
1. CPU 내부에 전달하는 제어 신호: 레지스터, ALU(연산 지시)
2. CPU 외부에 전달하는 제어 신호: 메모리(읽기/쓰기), 입출력 장치(읽기/쓰기)
📍 레지스터
레지스터는 CPU 내부의 작은 임시 저장장치로,
프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장되며 들여다볼 수도 있다.
레지스터의 종류는 CPU마다 다르지만 공통적으로 포함되는 레지스터가 존재한다.
1. 프로그램 카운터 = 명령어 포인터(Instruction Pointer)
- 메모리에서 가져올 명령어의 주소
- 가져오고 나면 자동으로 1 증가 (프로그램 순차 실행)
2. 명령어 레지스터 - 해석할 명령어(방금 메모리에서 CPU로 읽어들인 명령어), 제어장치가 해석
3. 메모리 주소 레지스터 - 메모리의 주소
- CPU가 읽어들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터
4. 메모리 버퍼 레지스터 - 메모리와 주고받을 값 (데이터, 명령어)
- CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터
5. 플래그 레지스터 - 연산 결과 or CPU 상태에 대한 부가적인 정보
6. 범용 레지스터 - 자유롭게 사용(여러 개 있음)
7. 스택 포인터 - 스택의 꼭대기 가리킴, 주소 지정에 사용
8. 베이스 레지스터 - 기준 주소 저장, 주소 지정에 사용
프로그램 카운터에 `1000` 저장된 경우:
- 메모리 주소 레지스터에 복사되고, 제어장치의 메모리 읽기 신호와 함께 주소 버스를 거쳐 전달됨
- 메모리는 `1000`번지에 저장된 값을 메모리 버퍼 레지스터로 데이터 버스를 통해 전달함
- 프로그램 카운터 1 증가함
- 가져온 명령어 `1101`은 명령어 레지스터에 담겨 제어장치에 의해 해석됨
🫧 주소 지정 방식 w/ 스택 포인터, 베이스 레지스터
1. 스택 주소 지정 방식
스택은 메모리의 스택 영역에 있고, CPU의 스택 포인터 레지스터가 스택의 꼭대기를 가리킨다.
스택 포인터: 스택의 꼭대기를 가리키는 레지스터 (= 스택이 어디까지 차 있는지)
2. 변위 주소 지정 방식
오퍼랜드 필드의 값(offset)과 특정 레지스터의 값을 더해 유효 주소를 얻는다.
대표적으로 2가지 방식이 존재한다:
1) 상대 주소 지정 방식
오퍼랜드 필드의 offset + 프로그램 카운터의 값 = 유효 주소
2) 베이스 레지스터 주소 지정 방식
오퍼랜드 필드의 offset + 베이스 레지스터의 값 = 유효 주소
📍 명령어 사이클
프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데,
이 주기가 바로 명령어 사이클이다.
예) 메모리에 저장된 명령어 실행
- 메모리에 저장된 값을 CPU 내부로 가져옴 ➡️ 인출 사이클
- 가져왔으면 실행 ➡️ 실행 사이클
일반적으로 CPU는 인출-실행-인출-실행-... 사이클을 반복한다.
그런데 CPU 명령어를 인출해 와도 바로 실행하지 못하고 추가적으로 메모리에 접근해야 하는 경우가 생길 수 있다.
- 메모리 접근이 더 필요한 경우 ➡️ 간접 사이클
즉 어떤 명령어는 인출-실행 사이클만으로 실행되고, 어떤 명령어는 인출-간접-실행 사이클을 거쳐 실행된다.
but 인터럽트는 이러한 CPU의 정해진 흐름을 끊어버린다.
📍 인터럽트
CPU가 먼저 처리해야 할 다른 작업이 생겼을 때 발생한다.
인터럽트의 종류 2가지:
1. 동기 인터럽트 (예외)
- CPU가 예기치 못한 상황을 접했을 때 발생
- 접근한 메모리 주소에 데이터가 없거나, 디버깅을 하거나, 실행할 수 없는 명령어가 있거나...
2. 비동기 인터럽트 (하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생
- 알림 같은 역할 (예: 입출력 작업이 완료되었다는 알림)
- CPU에 비해 느린 입출력장치의 입출력 작업 도중에도 CPU가 다른 작업을 처리할 수 있도록 함
(하드웨어) 인터럽트의 처리 순서:
1. 입출력장치가 CPU에 인터럽트 요청 신호를 보냄
2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인함
3. CPU가 인터럽트 요청을 확인하면, 플래그 레지스터의 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인함 (하드웨어 고장 같은 긴급한 경우는 인터럽트 플래그로 막을 수 없음 = non maskable interrupt)
4. 인터럽트를 받아들일 수 있다면, CPU는 지금까지의 작업을 스택 영역에 백업함
5. CPU는 인터럽트 벡터(각각의 인터럽트를 구분하는 정보, 하드웨어마다 다른 ISR의 시작주소 식별용, 보통 인터럽트 신호와 함께 전달됨)를 참조해 인터럽트 서비스 루틴을 실행함
6. 인터럽트 서비스 루틴 실행이 끝나면 백업해둔 작업을 복구하고 실행을 재개함
- 인터럽트 플래그 = 인터럽트 요청 신호를 받아들일지 무시할지 결정하는 비트
- 인터럽트 벡터 = 인터럽트 서비스 루틴의 시작 주소를 포함하는 식별 정보
- 인터럽트 서비스 루틴 = 인터럽트를 처리하는 프로그램
즉, "CPU가 인터럽트를 처리한다"
= "인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 되돌아온다"
'E-COPS' 카테고리의 다른 글
시스템해킹 스터디 - (2) CPU의 성능 향상 기법 (0) | 2025.04.09 |
---|---|
🍀 4월 1주차 TWIL (0) | 2025.04.07 |
🍀 3월 4주차 TWIL (0) | 2025.03.31 |
[포너블] 스택 카나리란? (0) | 2025.03.26 |
🍀 3월 3주차 TWIL (0) | 2025.03.23 |