주의) 이 글을 읽는 데는 기본적인 컴퓨터 구조와 MIPS, SIC 및 SIC/XE에 대한 선수지식이 필요합니다.
MIPS는 1 word = 4 bytes, instruction size = 4 bytes로, 둘이 같다.
나는 MIPS로만 컴퓨터 구조를 공부했었기에, 모든 ISA들의 1 word size와 instruction size가 무조건 같아야 하는 줄 알았다.
그러나 시스템프로그래밍을 공부하면서 SIC와 SIC/XE를 다루게 되었고, SIC/XE에서 가변 길이 instruction을 만나면서 멘붕이 왔다.
이 둘이 size가 다른 ISA가 있다니?? 오잉?? instruction fetch는 어떻게 하지?????
궁금한 건 해결하고 가야하는 성격...
그래서 관련 내용을 폭풍 검색하고 찾은 내용들을 정리해 적어보려 한다. (내 아까운 2시간...)
우리가 MIPS에서 배운 대로면, instruction fetch 단계에서는 1 word, 즉 4 bytes 만큼 fetch 해야 한다.
여기서 '4 bytes'라는 specific number은 중요하지 않다. ISA마다 1 word에 정의된 bytes size는 다를 수 있으니까. 앞서 언급한 SIC 및 SIC/XE 에서도 1 word = 3 bytes다.
중요한 건, MIPS 에서는 "1 word 만큼의 size를 fetch 했다"는 거다.
그럼 이게 다른 ISA들에서도 통할까?
SIC/XE에서 instruction size는 그 format에 따라 format 1~4까지 각각 1, 2, 3, 4 byte(s)의 size를 가진다.
그리고 SIC/XE의 1 word size는 SIC의 것과 동일하게 3 bytes다.
(이 내용은 알아내기 어려웠으나... https://perfect-occasion.co.kr/ 해당 블로그에 관련 내용이 나와있어 살았따.)
그럼, MIPS에서처럼 1 word size만큼 instruction fetch를 진행해 보자.
format 1 instruction, 즉 1 byte size instruction을 fetch 하려 한다고 가정해보자.
1 word = 3 bytes만큼 fetch된 3개의 bytes 안에는 rightmost byte 에만 우리가 얻고자 한 1 byte size instruction이 있을 거다.
그럼, 나머지 앞에 2 bytes에는 (아직) 내가 원하지 않는 data들이 들어가 있는거다.
물론, program은 어떻게 보면 sequences of intructions 이다. 즉 어떤 program에 대응되는 instruction들을 memory에 저장한다 했을 때 그걸 띄엄 띄엄 sparse하게 배치하지 않는다.
spatial locality를 만족하게끔 너무나도 당연하게 선형적으로 배치한다.
그렇기에 저 나머지 2 bytes 또한 내가 실행해야 할 다음 instruction들일 것이다. 매우 높은 확률로.
그러나, 만약 다음 instruction이 3~4 bytes 크기라면? 그 다음에 fetch할 영역과 걸쳐 있다면?
참 난감하다...
이럴 때, 어떻게 되는지 검색을 많이 해보았지만 정확한 해답은 얻지 못했다.
아마 고려해야 할 게 많아서 그런 것 같다. 왜냐하면 실제론 메모리랑 cpu가 곧바로 연결되는 게 아니라, cache를 사이에 두고 소통하니까. 또한 instruction fetch는 pipeline stage의 하나일 뿐이고, 실제론 decode가 순차적으로 발동하면서 여러 변인들이 있을 거니까..
"instruction fetch less than word" 같은 키워드로 구글 검색을 마구 돌려봤지만 결과는 애매한 답변들 뿐이었다.
그래서 일말의 희망만을 품고 gpt한테 물어봤는데...
"SIC/XE는 instruction의 alignment을 맞추기 위해, 3 bytes 단위로 instruction을 정렬합니다. Format 1 instruction이 1 byte를 차지하면, 남은 2 bytes는 다음 instruction의 첫 2 byte가 되어, 다음 fetch 시에 포함됩니다. 따라서, 1 byte의 Format 1 instruction을 읽고, 다음 2 byte를 포함하여 다음 instruction을 처리합니다."
라고 한다.
사실 그다지 신뢰는 안 간다.
gpt가 말 지어내는게 한 두번이어야지... 웹 검색으로도 제대로 안나오는 답변을 너가 어찌 그리 잘 하겠니...
그래도, 추상적으로는 대충 저정도로 이해해도 되지 않을 까 싶다.
앞서 언급했듯이 중간에 캐시도 껴있고, 파이프라인도 고려해야 하고...
그리고 최신 ISA 들이 저렇게 간단한 구조로 짜여있지도 않을 뿐더러
그 구조가 공개되어 있지도 않을 건데... 나같은 학부생이나 gpt 너가 어찌 알겠니.
1 word size보다 작은 byte의 instruction을 fetch할 때는, 저 정도로, 그 자투리 bytes 부터 다음 fetch가 시작된다고 생각하면 될 것 같다.
그럼, 1 word size보다 큰 byte의 instruction을 fetch할 때는, 어떻게 할까?
이 경우에 대해선 그나마 덜 애매한 답변들을 찾을 수 있었다.
cpu가 그만큼 fetch을 반복한다는 것(?)
pipeline과 연계해서 생각해야 하는데, decode stage에서 얘가 어디까지 instruction인지 보고, 더 필요하면 더 fetch 한다고 한다.
근데, decode -> fetch 단계 바로 가는 게 됐었나?
내 기억으론 저게 성립하려면 1 cycle stall이 들어가야 했을 텐데...
어쨌거나... 지금으로선 이게 한계다. 더 크면 더 반복한다. 이렇게만 일단 알고 가자.
https://www.quora.com/Does-a-CPU-word-size-always-match-the-length-of-an-instruction
https://cs.stackexchange.com/questions/68167/fetching-multi-word-instruction-from-memory
위와 같은 자료들에서 관련 내용을 찾을 수 있다.
물론 내 질문에 정확히 fit한 답변들은 아니었다
추후에 필요하다면 더 파고들기