배경 지식
[컴퓨터구조] 16비트 컴퓨터 설계하기 - Instruction Cycles
[컴퓨터구조] 16비트 컴퓨터 설계하기 - 명령어의 실행단계에서 벌어지는 일들
원래 이전 글 명령어의 실행단계에서 벌어지는 일들에서 I/O instruction의 실행까지 포함해서 보았어야 했다. 그러나 이번 내용이 너무 길어서 위 포스팅이 지루해질까봐 따로 글을 쓴다.
오늘은 "명령어의 실행단계에서 벌어지는 일"
그 중 input-output명령의 실행단계에서 벌어지는 일들을 공부해보자.
3. Execution of Input-output Instruction
이전 포스팅에 이어서 쓰는 거라 3으로 넘버링한다.
Interrupt 개념 이해하기
I/O명령어를 실행하는 과정을 이해하기 위해서는 먼저 Interrupt라는 개념을 이해해야 한다.
대표적인 input인 키보드 입력을 생각해보자. 키보드 입력 이벤트가 언제 발생되는지는 모른다. 사람에 의해 완전히 랜덤이다. 그럼 CPU는 키보드입력을 어떻게 대비해야 하는가?
▶ 비동기 이벤트: 어느 시간에 발생할지 예측할 수 없는 이벤트다. 키보드 입력 등.
▶ CPU가 항상 키보드 인풋을 수시로 체크하는 방법은 상당히 비효율적이다. 그래서 절대 이렇게는 안한다!
▶ CPU는 그런 세세한 체크를 할 시간이 없다. 그저 자기 일만 수행하고 있게 한다. 인풋의 체크는 키보드컨트롤러(I/O디바이스)가 담당한다. 키보드 인풋이 들어오면 interrupt가 걸린다!
▶ interrupt가 걸렸으면 그때 CPU에게 interrupt가 걸렸다고 전달하면 된다. 그럼 CPU는 키보드 입력이 발생했을 때만 처리하고 다시 자기 할 일을 하면 된다.
▶ 한마디로 interrupt란 비동기 이벤트가 발생했다는 사실을 CPU에게 알려주는 매커니즘이다.
[ interrupt 개념 잡기 plus ]
- 휴대폰에 전화는 언제 올지 안올지 모른다. 만약 전화벨이라는 것이 없다면, 전화가 언제 걸려오는지 모르니까 사람은 휴대폰을 계속 열어봐야 한다. 왔나 안왔나 시도때도 없이 열어봐야 한다. 그럼 우리가 핵심적인 일을 할 수가 없다. 상당히 비효율적이다. 하지만 실제로는 전화가 오면 전화기가 벨로 알려준다! 이 벨이라는 것이 interrupt의 개념과 비슷하다.
- 택배도 좋은 예시다. 우리는 택배가 왔는지 안왔는지 문을 계속 열어볼 필요가 없다. 택배가 오면 문이 두드려지거나 문자로 택배가 왔다고 알려주기 때문이다. 문자 알림이나 노크같은 것이 interrupt의 개념과 비슷하다.
그렇다. CPU는 그냥 자기 일을 열심히 수행중이다.
좀 더 자세히 말하자면 i번째 instruction에 대한 사이클을 돌리는 중이다.
그런데 I/O디바이스에서 inturrupt 신호를 띄워 CPU에게 알려주는 건 알겠는데, CPU는 그 신호를 언제 감지할까?
CPU가 현재 수행중인 i번째 instruction을 끝내면 time이 T0가 된다고 이전 글에서 배웠다. time T0인 상황에서 다음의 i+1번째 명령어를 fetch하는데, 다음 명령어를 fetch하기 전에 inturrupt를 체크한다! 즉, i번째 명령어가 끝나고 time T0가 되었을 때 inturrupt를 체크한다. 그때 감지가 되면 다음의 i+1번째 명령어를 수행하지 않고 inturrupt 사이클로 넘어간다! interrupt 사이클은 세단계 (T0, T1, T2)로 이루어져있다. i번째 명령어를 끝낸 현재는 time T0인 상황이니 interrupt 사이클에서도 역시 T0부터 돌리게 된다.
CPU가 inturrupt 사이클 갔다가 I/O 명령에 대한 instruction subcroutine 을 완전히 처리하고 나면,
다시 아무 일도 없었다는 듯이 0번지에 넣어둔 return address로 가서 i+1명령을 태연하게 수행하면 된다.
inturrupt Cycle
알고 가야 할 것
- i+1번째 명령어를 해결하려던 중에 interrupt를 발견해서 interrupt cycle로 넘어간 것이므로, i+1번째 명령어가 들어있는 메모리 번지는 반드시 기억해둬야 한다. 그리고 I/O 명령 수행을 마치면 다시 그곳으로 되돌아가야 한다. 그 주소를 return address라고 한다.
- 원래 일반적인 컴퓨터들은 inturrupt가 걸렸을 때 return address를 stack에 저장해둔다.
- 하지만 우리가 설계하는 16비트 Basic 컴퓨터는 상당히 단순하여 Stack이라는 자료구조가 없다.
- 그래서 특별한 주소인 0번지에 return address를 저장한다.
- 또 다른 특별한 주소인 1번지는 실제적인 I/O instruction subroutine이 있는 곳으로 branch하게 하는 명령어를 넣어둔다.
일단 여기까지 아 그렇구나 하고,
어서 interrupt cycle로 들어가보자.
■ interrupt cycle
▶ interrupt 신호는 R이라는 flip-flop에 저장된다.
▶ 만약 CPU가 R=1인 것을 감지했으면 아래 사이클을 수행한다.
◆ RT0 : AR<-0, TR<-PC
- 특별한 주소인 0에 return address를 넣어두기 때문에, AR<-0으로 바꿔둔다.
- temprary register인 TR에 PC값을 넣어둔다. 현재 PC값은 i+1명령어가 있는 번지이다. I/O명령을 수행하고 다시 돌아와서 i+1명령어를 수행해야 하기 때문에 PC값도 잃어버리면 안 된다.
◆ RT1 : M[AR]<-TR, PC<-0
- TR값을 메모리의 AR번지, 즉 0번지에 넣어둔다. 그럼 0번지에 i+1명령어가 있는 번지를 넣어둔 것이다.
- PC를 0으로 초기화한다.
◆ RT2 : PC<-PC+1, IEN<-0, R<-0, SC<-0
- PC값을 1 증가시시켜 1로 만든다. 왜냐하면 1번지 또한 특별한 주소여서!
- 이따가 1번지로 가서 본격적인 I/O instruction을 처리하는 instruction subroutine으로 branch하는 과정도 볼 것이다.
- IEN을 0으로 해두면 외부에서 inturrupt가 disable처리된다. interrupt를 걸어도 interrupt가 걸리지 않는다. 대략 전화기선을 빼놓으면 전화가 안걸리는 느낌이다.
- R도 다시 0으로, SC도 다시 0으로 바꿔둔다. 이제 interrupt cycle은 그만 나오고, I/O instruction subroutine을 돌릴 차례다. 그만 cycle에서 나오자!
■ cycle에서 빠져나온 현황
* 현재 PC값은 1이다.
이를 유념하고 아래 흐름을 보자
- interrupt cycle을 돌고 나와서 R은 0인 상황이다. 그래서 instruction cycle로 들어간다.
- PC는 1인 상황이므로, 1번지에 있는 instruction을 수행하게 된다.
- 1번지에는 뭐가 있을까? 1번지에는 branch 명령을 담아둔다. 그럼 어디로 branch할까? I/O instruction이 있는 번지로 branch한다. 이제 드디어 I/O instruction을 본격적으로 수행하러 간다! 아래 예시로 확인해보자.
- 참고로 FGI는 input flag, FGO는 output flag이다. IEN은 interrupt enable이다.
■ interrupt cycle 후에 I/O instruction을 실행하는 상황 예시
- (a)는 interrupt cycle을 돌기 전이라 주소 0번지에 return address가 들어와있지 않다.
- (b)는 interrupt cycle을 돌고 나서이다. 그래서 0번지에 return address(i+1번째 명령어 번지)가 256으로 들어가있다.
- 흐름은 빨주노 순서로 보면 된다.간단히 설명하겠다!
- 현재 PC가 1이다. 1번지에는 BUN명령이 있다. direct로 1120번지에 branch하자.
- 1120번지에 가서 I/O program을 쭉쭉 수행한다. 다 하고나면 마지막엔 항상 branch하는 명령어(BUN)가 있다.
- indirect 모드로 0번지로 branch하자.
- 0번지에 있는 주소값 256번지(return address)로 가서 수행하자!
- 256번지는 즉 i+1번째 명령어가 있는 번지다. 즉, 우리는 지금 비동기식 I/O명령 발생을 처리하고 다시 i+1명령어를 수행하러 왔다!
I/O instruction 실행도 다 공부했다.
아래 회로는 instruction 실행에 대한 종합적인 flowchart다. 이건 다음 포스팅에서 자세히 확인해보자.
이 포스팅은 I/O instruction을 실행(execute)하며 일어나는 micro-operation에 집중해보았다.
다음 포스팅에서는 명령어 종류에 상관없이 총정리해놓은
위 flowchart를 슥 보자.
'컴퓨터구조 & OS' 카테고리의 다른 글
[컴퓨터구조] 16비트 컴퓨터에서 프로그래밍 하기 | assembly로 쓰여진 프로그램의 구조 (0) | 2021.10.18 |
---|---|
[컴퓨터구조] 16비트 컴퓨터 설계하기 - instruction 실행의 종합적인 흐름 | flowchart (0) | 2021.10.16 |
[컴퓨터구조] 16비트 컴퓨터 설계하기 - 명령어의 실행단계에서 벌어지는 일들 (2) | 2021.10.15 |
[컴퓨터구조] 16비트 컴퓨터 설계하기 - Instruction Cycles (2) | 2021.10.15 |
[컴퓨터구조] 16비트 컴퓨터 설계하기 - Control unit 설계 (0) | 2021.10.14 |