티스토리 뷰
https://www.youtube.com/watch?v=3Yz7OnVUM28&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=13
초심으로 돌아가서 다시 정리하는 개념입니다.
이미 알고 있어 스킵하는 부분도 있으니, 직접 보시는 걸 추천드립니다.
컴퓨터 구조에서 중요한 파트중 하나입니다.
MCU에서도 중요한 개념이므로 임베디드 개발자도 익혀야 하는 내용입니다.
명령어 사이클
프로그램이 실행되는 주기를 명령어 사이클이라고 한다.
CPU는 메모리 안에 있는 프로그램을 일정한 주기로 정해진 흐름대로 명령어를 처리하나(명렁어 사이클)
간혹 정보 흐름을 방해하는 신호를 받을 수도 있는데, 이를 인터럽트라 한다.
인출 사이클: 가장 먼저 CPU로 가지고 온다.
실행 사이클 : 가지고 온 뒤실행
인출-실행-인출-실행
그런데 CPU로 명령어를 가지고 와도 실행이 불가능한 경우도 있다(간접 주소 지정 방식 등)
그래서 인출 사이클과 실행 사이클 사이에 메모리 접근이 더 필요한 경우, 간접 사이클을 추가한다.
이런 정해진 흐름을 끊는 걸 인터럽트라 한다.
여기서 인터럽트 사이클이 추가된다.
인터럽트
CPU가 꼭 주목해야 할 때에 발생
- 동기 인터럽트(예외) : 예외적인 상황에 발생. CPU가 예기치 못한 상황을 접했을 때
> 홀트, 트랩, 중단, 소프트웨어 인터럽트가 있다.
- 비동기 인터럽트(하드웨어 인터럽트) : 주로 입출력 장치에 의해 발생하는 인터럽트
알림(세탁기 완료 알림, 전자레인지 조리 알림)과 같은 역할
하드웨어 인터럽트는 왜 사용하는가?(중요)
입출력 작업 도중에도 효율적으로 명령어를 처리하기 위함이다.
입출력 장치는 CPU에 비해 느리기 때문에, 인터럽트가 없다면 CPU는 프린트 완료 여부를 확인하기 위해 주기적으로 확인해야 한다.
그런데 인터럽트가 있다면 입출력 작업 동안 CPU는 다른 일을 할 수 있다.(끝나면 알려주는 것)
인터럽트의 처리 순서
1. 입출력장치가 CPU에 인터럽트 요청 신호를 보낸다.
2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 인터럽트를 받아들일 수 있는지 여부를 확인한다.
4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업
5. CPU는 인터럽트의 벡터를 참조하여 인터럽트 서비스 루틴 실행
6. 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해 둔 작업을 복구하여 실행을 재개한다.
인터럽트 요청 신호 : 지금 뛰어들어도 되는지 CPU에게 요청
인터럽트 플래그 : 인터럽트 플래그를 확인하고 인터럽트를 받아들인다. 모든 인터럽트를 플래그로 막을 수 있는 건 아니다.(NMI)
인터럽트 서비스 루틴 실행 : 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램
> "키보드가 인터럽트를 보내면 어떻게 행동하세요"
프로그램이기에 전부 메모리에 저장되어 있다.
CPU는 인터럽트가 발생하면 메모리에서 해당 프로그램까지 수행하고, 메모리에 저장된 인터럽트 서비스 루틴 프로그램으로 점프를 한 뒤에 다시 돌아온다.
인터럽트 벡터 : 각각의 인터럽트를 구분하기 위한 정보(인터럽트 서비스 루틴의 시작점을 알기 위한 표)
실행하는 과정에서의 문제
인터럽트가 발생했을 때, CPU에 이미 있는 (프로그램 카운터, 레지스터) 등에 있는 값들을 어떻게 처리해야 하는가?
지금까지 한 작업을 어디다가 백업을 해 놓아야 한다.
그 백업을 위해서 스택 영역에 백업을 하게 된다.
이 데이터는 인터럽트 서비스 루틴이 실행 된 후에 복구한다.