CS/Computer Architecture

[컴퓨터구조] 5-5.3. Instruction Cycle(register-reference, I/O Instruction)

F12:) 2023. 9. 27. 23:32

5-5.2에서는 Instruction Cycle 중 Memory-reference 에 대해서 알아보았습니다. 그래서 오늘은 Register-reference와 I/O instruction에 대해서 다뤄보겠습니다.

 


Register-reference Instruction

register-reference instruction은 총 12가지의 연산으로 이루어져있었습니다. 설명에도 나와있지만 통상 우리는 D7I'T3를 r로 치환하여 사용합니다. (T3 자체가 결국 세부 연산으로 나눠지는 Timing이기 때문이죠, D7, I도 마찬가지로 세부 연산을 나눌 수 있는 기준입니다.)

 

B0 - B11은 각 비트의 자리수가 1인지 아닌지를 판단하는 것입니다. 만약 B11이라면 11번째 비트가 1인지 아닌지를 보는 것이죠.(시작은 0번째 입니다.)

 

그렇게 각 세부 연산이 정의되어 있습니다. register-reference는 not-memory-reference 이기 때문에, 따로 operand가 필요하지 않은 연산입니다.

 

 

 

Input-Output Instruction

이 부분을 이번 글에서는 조금 자세하게 다뤄볼까 합니다. 과거 우리는 I/O Operation을 수행하기 위해서는 CPU가 device 자체를 계속 확인해야 했습니다. 왜냐하면 I/O event는 비동기로, 사용자가 언제 입력할지를 컴퓨터는 알지 못하기 때문이죠.

 

하지만 과거 CPU가 직접 device 자체를 확인하는 것은 너무 비효율적이었습니다. 그래서 Interrupt라는 개념이 등장합니다.

 

Interrupt

컴퓨터에서는 꽤 중요한 개념으로 작용합니다. Interrupt란, I/O 입력과 같은 비동기 event가 발생한 것을 CPU에게 알려주는 매커니즘을 의미합니다.

 

간단한 예를 들어서, 이해를 돕고자 합니다.

 

저는 평소 공부할 때, 휴대폰을 무음모드를 해놓고 공부를 합니다. 따라서, 알림이나 전화가 왔을 때 확인할 수 없다는 단점이 있습니다. 그래서 휴대폰을 수시로 확인합니다. 알림이 오지는 않았는지, 전화는 안왔는지 누구에게 카톡은 오지 않았는지... 사실 이렇게 되면 공부에 제대로 집중을 할 수 없습니다. 또한 휴대폰을 확인하는데 굉장히 많은 시간을 쏟게 됩니다. 따라서, 언제 올 지 모르는 이러한 사건들을 비동기 event라고 합니다.

 

그래서 저는 휴대폰을 벨소리로 바꿨습니다. 이제는 벨소리가 울리지 않는다면 휴대폰의 알림은 오지 않은 것이기에 휴대폰을 확인하지 않고 공부에 집중할 수 있습니다. 공부를 하다가 벨소리가 울리면 하던 공부를 멈추고 휴대폰을 확인합니다. 이 때, 벨소리가 Interrupt의 개념이 되는 것입니다. 마치 저(CPU)에게  벨소리(Interrupt)로 전화가 왔음(비동기 event가 발생했음)을 알려주게 되는 것입니다.

 

자, 이제 Interrupt의 개념도 이해했으니, Instruction Cycle을 확인해야겠죠??

 

우리는 컴퓨터 내에서 이러한 비동기 이벤트가 발생했음을 알려주는 벨소리를 R이라는 interrupt flip-flop을 이용합니다. 따라서 CPU는 interrupt flip-flop을 확인만 하면 비동기 event의 발생 여부를 파악하는 것입니다. 사실 이러한 비동기 이벤트는 stack에 저장하여 관리하는 것이 대부분입니다만, 여기서 설계하는 16비트의 컴퓨터는 단순한 비동기 event 하나만을 고려하기에 1비트로도 표현할 수 있는 것입니다.

 

저번 글에서 T0부터 모든 instruction은 실행된다고 배웠습니다. 지금 제가 이렇게 블로그에 글을 쓰는 것조차도 T0부터 계속 cycle을 돌아가는거라고 할 수 있죠. Interrupt는 그 전, 그러니까 T0로 돌아오자마자 T0의 연산을 수행하기 이전에 R을 확인합니다. 만약 R이 1이라면 Interrupt가 발생한 것이므로 Interrupt에 대한 처리를 빠르게 해줍니다.

 

Interrupt에 대한 처리를 메모리에 상주해있어야합니다. 따라서 우리가 지금 설계하고 있는 16비트 컴퓨터에서는 0번째 비트에 Interrupt가 걸리기 전의 주소를 저장합니다. 원래 기본적인 컴퓨터에는 0번지부터 OS가 쭉~ 차지하는 것이 일반적이지만 16비트 컴퓨터인 여기서는 그렇지 않습니다.

 

R=1일 때의 cycle.

우선 RTL로 봅시다. T0가 되자마자 컴퓨터는 R을 확인합니다. 0이면 패스하고, 1이면 위의 cycle을 돕니다. 

 

우선 AR을 Clear 합니다. 즉, 이제 우리가 수행할 Instruction이 0번지라는 것을 의미합니다. PC를 TR(Temporary Register)에 저장합니다. 우리는 Interrupt에 대한 작업이 끝나면 다시 원래 위치로 돌아와야하기 때문에 저장해야합니다.

 

T1에서는 M[AR] <- TR을 수행하는데, 이것이 0번지에 우리가 지금 수행하는 instruction의 주소를 저장하는 것입니다. 앞서 말한 것과 일맥상통하는 말입니다. Interrupt에 대한 수행을 끝내고 Interrupt를 다루기 전의 과정으로 다시 돌아가야하므로, 그것을 기억하기 위해 메모리 주소 0번지에 저장합니다. 그 후, PC를 Clear 합니다.

 

T2에서는 PC <- PC+1을 통해 Interrupt 처리를 수행하기 위한 세팅을 해줍니다. 0번지에는 Return Address를, 1번지부터는 실제 Interrupt를 다루를 연산이 들어가기 때문에, PC를 1로 만들어주는 것입니다.

그 후의 동작은 IEN <- 0입니다. 우리는 Interrupt가 걸렸다면, 다른 Interrupt가 올 수 없으므로 IEN(Interrupt Enable)을 1로 만듭니다.

하지만 여기서는 Interrupt에 대한 세팅이 끝났으므로, 다시 IEN을 0으로 clear해줘서, Interrupt를 다시 수신할 수 있는 상태로 만들어주어야하는 것입니다.

마지막으로 T0에서 다시 시작하기 위해 SC <- 0을 해주면 Interrupt를 실행할 준비가 된 것입니다.

 

 

이제 평소처럼 Instruction을 수행하면 컴퓨터는 1번지에 있는 Interrupt에 대한 instruction을 수행하게 될 것입니다. 당연하게도 Interrupt Instruction이 끝났을 때에는, 마지막에 BUN으로 0번지가 indirect address mode로 지정되어 있고, 그렇게 되면 0번지로 돌아가 우리가 저장한 return address에 다시 도달할 수 있게 됩니다.

 

Instruction flow chart와 Interrupt의 처리과정까지 한번에 나타낸 flowchart 입니다.

 

사실 CPU는 하나의 일만 가능하지만, 이 플로우 차트에너는 병렬적으로 처리되는 것처럼 표현했습니다. 하지만 표시된 것처럼 Hardware가 작동하는 부분과 Software가 처리하는 부분이 있기 때문에 가능한 것입니다.

 

여기서 FGI, FGO와 같은 용어가 나오는데, Flag Input, Flag Ouput을 의미하는 것입니다. 일어난 Event가 Input에 대한 것인지 Output에 대한 것인지를 나타내는 것이죠.

 

이 그림은 잘 이해될거라고 생각합니다.

 

 

 

 

자! 이제 메모리 내에서 Interrupt를 수행할 때의 cycle을 도식화해서 확인해보겠습니다.

파란색 -> 빨간색 -> 초록색 순서로 이해하자.

255번 Instruction을 수행하던 도중 Interrupt가 발생했고, CPU는 255번을 모두 수행한 뒤 Instruction을 수행하기 위해 세팅하는 과정을 보여줍니다. 

 

가장 먼저 PC를 0번지에 저장합니다. 그 후, 0번지 다음 주소인 1번지를 PC가 가리키게 해서 1번지가 가르키는 주소에 가 Interrupt에 대한 Instruction을 처리하게 하는 것입니다. 이렇게 되면 I/O Program을 수행하게 되고, 다 끝났으면 BUN에 의해 0번지에 가서 주소를 읽어와 해당 주소에 대한 Instruction을 다음에 수행합니다.

 


 

오늘 Interrupt 개념까지 해서, Instruction Cycle에 대한 내용은 끝났습니다. 이제는 우리가 지금까지 배운 것들을 통해서 컴퓨터의 동작들을 다시 한번 살펴보고 복습해보는 시간을 갖겠습니다.