명령어 사이클과 인터럽트

손원진·2023년 3월 14일
0

컴퓨터기초

목록 보기
10/11


cpu는 메모리안에있는 명령어나 데이터를 정해진 흐름대로 처리하게된다.
그정해진 흐름 주기를 명령어 사이클이라고 부른다. 간혹 그 정해진 흐름을 방해하는 신호가 있는데 그 신호를 인터럽트라고 합니다.

cpu는 메모리에서 데이터를 가져오는 인출과, cpu내부에서 레지스터와, ALU, 제어장치로 실행하는 인출과 실행을 반복한다. 이게 명령어 사이클에 일부이다.


그런데 CPU로 명령어를 가지고와도 바로 실행이 불가능한 경우가 있다.
위에 그림은 간접 주소지정 방식을 나타낸다(모르면 책보고 다시복습)

이런식으로 인출한다음 메모리접근이 더 필요한 경우에는 간접사이클을 거친다.

보통은 이런식으로 인출 실행과정을 거쳐 명령어 사이클이 실행되지만, 중간에 INTERRUPT가 끼는 경우가 발생한다.

인터럽트의 종류에는 동기인터럽트와 비동기인터럽트가 있다.

동기인터럽트(exception)

cpu가 예기치 못한 상황이 발생했을 때 발생,
예외적인 상황이 발생해서 실행을 중단하고 이걸 먼저 처리하는 것 (디버깅)

fault, trap, 등등

비동기 인터럽트

비동기 인터럽트 : 주로 입출력 장치에 의해 발생

알림(전자레인지 조리알림)과 같은 역할

컴퓨터를 켰을 때 어떤 키를 누르면 명령어 입력 창으로 넘어가는 것

하드웨어 인터럽트를 왜쓰는가 ?

입출력 장치는 cpu에 비해 느리다. 인터럽트가 없다면 cpu 는 프린트 완료여부를 확인하기위해 주기적으로 확인해야한다.

하드웨어 인터럽트의 처리순서

  1. 입출력 장치는 CPU에 인터럽트 요청신호를 보낸다.
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기전 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
  6. 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해둔 작업을 복구하여 실행을 재개한다.
  • 인터럽트 요청신호 : CPU의 작업을 방해하는 요청신호
  • 인터럽트 플래그 : 인터럽트 요청신호를 받아들일지 무시할지 결정하는 비트
  • 인터럽트 벡터 : 인터럽트 서비스 루틴의 시작주소를 포함하는 인터럽트
    서비스 루틴의 식별 정보
  • 인터럽트 서비스 루틴 : 인터럽트를 처리하는 프로그램
    인터럽트의 처리순서


인터럽트 요청신호를 보내고

플레그 레지스터속으로 저장한다. 여기선 현재 인터럽트를 받아들일 수 있다 0 받아들일 수 없다 1로 표기가 될 것이다. (인터럽트를 받아들일 수 있는 상황이라면 처리가된다.) 너무 긴급한(하드웨어 고장)같은 경우에는 인터럽트 플래그로 막을 수 없다

이렇게 막을 수 없는 인터럽트는 non maskable interrupt이다.

CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스루틴을 실행한다.

인터럽트 서비스루틴은 키보드가 오면 이렇게 진행하세요
마우스가 오면 이렇게 진행하세요같은 서비스를 진행하는 루틴이다.
인터럽트 서비스루틴도 프로그램이기 때문에 메모리에 저장이 된다.

인터럽트마다 고유한 인터럽트서비스 루틴에 주소를 가지고 있다. 인터럽트를 보낼 수 있는 주체에 따라서 인터럽트 서비스 루틴에 시작 주소가 달라질 수 있다. CPU가 해당 인터럽트의 시작주소는 무엇인지 그 인터럽트를 구분하기 위한 정보가 필요하다. 각각의 인터럽트를 구분하기 위한 정보를 인터럽트 벡터라고 한다.

인터럽트 벡터들을 표처럼 모아놓은 것(인터럽트 벡터테이블은 메모리에있다)
인터럽트 서비스 루틴에 시작주소를 알기위해서 인터럽트 벡터를 필요로 한다,

인터럽트를 보내는 주체는 항상 인터럽트 벡터도 같이 CPU로 데이터를 보낸다. 인터럽트의 시작주소는 인터럽트 벡터를 통해서 알 수 있기 때문이다.

인터럽트 서비스루틴을 사용하려면 기존에 있던 레지스터는 어떻게 해야할까 버려야할까?

아니다 기존에있던 레지스터는 백업을진행해야한다. 지금까지에 내용들은 STACK에 저장을 해놓는다.

인터럽트 서비스 루틴이 끝나면 스택영역에 데이터를 불러와서 백업하고 CPU로 가져온다.

profile
매일 한 걸음

0개의 댓글