난 그냥 인터럽트 발생시에 '모든 레지스터값을 저장하고 커널모드에서 일을 처리한다 복구한다'정도로 대충 간단하게 알고 있었는데


조금 생각해보니 이거 불가능한거 아닌가 싶어서 질문해봄.



흔히 펑션콜에서 레지스터값을 저장할때 caller, 또는 callee쪽에서 레지스터를 스택에 저장했다가 불러오는 식으로 구현되잖아?


인터럽트도 어떤의미론 펑션콜의 일종이라고 생각을 할 수 있을테고.



인터럽트가 발생하면, 그 발생했을때 수행중이던게 caller가 되는걸텐데


'caller'쪽에서는 레지스터값을 저장하는건 불가능하고


결국 callee에 해당하는 쪽에서 레지스터값을 저장해두고 인터럽트를 처리한후 다시 이를 복원해야하는게 아닌가?



근데 인터럽트를 처리한후 다시 원래 명령으로 돌아가면 결국 $ra 같은식으로 레지스터를 이용해서 해야되잖아.


그럼 돌아오기위해 사용한 레지스터의 기존값은 새로 덮어씌워졌으니 복구되는게 아니지않아?



뭐 mips같은 경우엔 커널을 위한 레지스터가 있으니까 $ra대신 $k1같은걸 사용하면 유저를 위한 레지스터는 모두 보존할수 있겠지만


엄밀히 말하면 모든 레지스터가 복원되는건 아니지않아?





내가 생각한식으로 인터럽트가 처리되는게 아니라면 내가 뭘 잘못생각했는지,

아니면 내 생각이 맞고 인터럽트시 보존되는 레지스터가 유저를 위한 레지스터로 한정되는건지.


궁금한데 답해줄 갤러 있음?ㅠ