CS/컴퓨터구조(Mano)

[컴퓨터구조] ch.5 기본 컴퓨터의 구조와 설계 (8) 입출력과 인터럽트

하늘아래현서 2024. 10. 2. 23:11
Mano의 컴퓨터시스템구조 제3판, 프로텍 미디어, 김종상 옮김 도서를 정리, 요약하는 글입니다.

 

1. 입출력 구성

- 컴퓨터는 외부 장치 예를 들어 키보드, 프린터와 같은 입출력 단말 장치와 통신을 해야할 수 있어야 한다. 이러한 입출력 통신에 대한 기본적인 요구사항은 다음과 같다.

 

사진 출처 : https://upscfever.com/upsc-fever/en/gatecse/en-gatecse-chp157.html

 

- 단말기는 정보를 직렬로 주고 받으며, 각 정보는 한 개의 영자숫자 코드당 8비트가 된다. 키보드로부터 받은 직렬 정보는 송신기 인터페이스(transmitter interface)를 통해 입력 레지스터(INPR)에 시프트되고, 프린터에 대한 직렬 정보는 수신기 인터페이스(receiver interface)를 통해 출력 레지스터(OUTR)로 정보를 받아서 프린터에 직렬로 전송한다.

- INPR는 영자숫자 입력 정보를 나타내고, FGI는 제어 플립플롭이다. 새로운 정보가 입력 장치에서 이용 가능한 상태이면 플래그(flag) 비트는 1로 세트되며 컴퓨터가 그 정보를 받아들이면 클리어된다. 플래그는 입력 장치와 컴퓨터 사이에 다른 타이밍 속도를 동기화하기 위해 필요하다. 

 

(1) 키보드 입력

- FGI = 0 : 입력 받을 수 있는 상태

- FGI = 1 : 키보드 입력이 INPR에 들어와 있고, 컴퓨터가 이를 처리하기 전까지는 새로운 입력을 받을 수 없다.

- 처음에 FGI는 클리어 되어 있고, 키보드의 키를 쳤을 때 8비트 코드가 INPR에 시프트 된 후 FGI는 1로 세트된다. 플래그가 세트되어 있는 동안은 다른 키를 쳐서 INPR에 있는 값을 바꿀 수 없다. 컴퓨터는 플래그를 체크하여 1이면 INPR로부터 AC로 병렬 전송하고 FGI를 클리어한다. FGI가 클리어되면 새로운 정보를 INPR로부터 시프트될 수 있다.

 

(2) 프린트 출력

- FGO = 1 : 출력 장치가 데이터 받을 준비가 된 상태. 

- FGO = 0 : 현재 출력 작업 중이므로 새로운 데이터를 OUTR에 넣을 수 없다.

- 만약 FGO는 1로 세트되어 있다면 컴퓨터는 FGO를 체크해서 1이면 AC로 부터 OUTR 정보를 병렬 전송한다. 그 다음 FGO를 클리어시키면 출력 장치는 OUTR로부터 정보를 가져가고 해당되는 문자를 프린트한 후 FGO를 1로 세트한다. FGO가 0인 상태에서는 컴퓨터가 OUTR에 새로운 정보를 넣지 못한다.

 

- 자칫 키보드와 프린트의 플래그가 반대로 되어 있어서 헷갈릴 수도 있는데, 키보드는 입력장치, 프린트는 출력 장치임을 생각하면 된다. FGI는 컴퓨터가 입력 데이터를 처리할 준비가 되었는지 나타내고, FGO는 출력 장치가 출력 데이터를 받을 준비가 되었는지 나타낸다. 입력 장치는 컴퓨터가 데이터를 받아야 하는 시점을 FGI를 통해서 알려주고, 출력 장치는 데이터를 받아서 출력할 수 있는 시점을 FGO를 통해서 알려주기 때문이다.

 

2. 입출력 명령어

 

사진 출처 : https://upscfever.com/upsc-fever/en/gatecse/en-gatecse-chp157.html

 

- 입출력 명령의 종류의 위 표와 같다. 입출력 명령어의 연산 코드는 1111 이므로 D7IT3의 부울식이 공통으로 필요하고 이는 간단히 p라고 표기한다. IR(6-11) 레지스터의 각 비트를 Bi로 표기한다. 따라서 모든 제어 함수는 pBi 형태로 표시할 수 있다. 순차 카운트 SC는 p = D7IT3 = 1 일 때 클리어된다.

- INP 명령어는 입력 정보를 INPR에서 AC의 하위 8비트에 전송하고 입력 플래그를 클리어한다. OUT 명령어는 반대로 AC 하위 8비트를 OUTR에 전송한다.

- SKI, SKO는 플래그의 상태를 검사하여 그 값이 1이면 다음 명령어를 건너 뛰는 명령이다. 즉 플래그가 0이면 계속 분기 명령문을 실행하다가 플래그가 1이되면 분기 명령문을 탈출하고 다음의 명령어를 가져와서 수행하는 것이다. IEN은 다음 장에 나온다.

 

3. 프로그램 인터럽트

- 플래그를 사용한 통신 방법을 프로그램 제어 전송이라고 하는데 이것은 프로세서와 입출력 장치와의 속도 차이 때문에 매우 비능률적이다. CPU 프로세서가 입출력 장치의 상태를 계속 확인하고 있는 것은 매우 비효율적이기 때문이다. 이 방법 대신 외부 장치가 전송 준비가 다 되었을 때 컴퓨터에게 그것을 알리는 방식을 쓰고 있다.

- IEN(interrupt enable flip-flop) 컴퓨터는 프로그램을 실행하는 동안은 플래그 상태를 확인하지 않고 있다가 플래그가 세트되면 컴퓨터는 실행 중이던 프로그램을 중지하고 입출력 명령을 실행하게 된다. R은 인터럽트 플립플롭이다. 

- R = 0 : 명령어 사이클 수행한다. 명령어 사이클 실행 단계에서 IEN 검사하고 IEN이 만약 1이고 FGI나 FGO가 1이면 R = 1 세팅, 실행 단계 마지막에 R이 1이면 인터럽트 사이클 수행

- R = 1 : 인터럽트 사이클 수행한다. 복귀해야 할 주소를 레지스터나 스택, 특정 메모리 주소에 저장한다. 이 흐름도에서는 메모리 주소 0에 저장하였다. 그리고 PC에 주소 1을 넣고 IEN, R을 클리어하여 인터럽트가 완료되기 전까지는 다른 인터럽트가 발생하지 못하도록 한다. 

 

4. 인터럽트 사이클

- 인터럽트 플립플롭 R은 IEN = 1이고 FGO = 1 or FGI = 1일 때 1로 세트된다. 이는 타이밍 신호 T0, T1, T2 외의 어떤 시간(명령어 인출이나 명령어 해독이 아닌 시간)에서 수행된다. 레지스터 전송문으로 나타내면 다음과 같다.

  T0'T1'T2'(IEN)(FGI + FGO) : R ← 1

 

- R = 0일 때 : 명령 사이클이 수행, 명령 사이클의 fetch와 디코드 단계에서는 제어 함수는 아래와 같이 수정한다.

  R'T0, R'T1, RT'2

 

- R = 1일 때 : 인터럽트 사이클이 수행, 복귀 주소를 메모리의 주소 0에 저장하고 프로그램 실행 주소를 1로 분기시킨 다음 IEN, R, SC를 모두 0으로 클리어 한다. 여기서 복귀 주소를 가지고 있는 PC 값을 메모리에 저장하기 위해서 임시 레지스터 TR에 저장하고 PC 값은 0으로 세팅한다. (복귀할 주소를 0번지에 저장하기로 설정) 이전의 마이크로 연산이 끝난 다음에는 메모리 주소 1에 있는 BUN 명령어가 실행되어 인터럽트 서비스 서브루틴으로 분기가 일어난다.

  RT0 : AR ← 0, TR ← PC

  RT1 : M[AR] ← TR, PC ← 0
  RT2 : PC ← PC +1 , IEN ← 0, R ← 0, SC ← 0