##################################
# 인터럽트(트랩) 호출(발생) 시 - opcode:CD
##################################
1. cpl과 인터럽트 디스크립터의 dpl이 다르면
1-1. ss, esp를 백업해두고 TSS영역에 기록된 해당하는 인터럽트 디스크립터 dpl의 ss, esp으로 변경
1-2. 앞서 백업해둔 ss, esp를 push ss, push esp
(즉, 커널 스택에 push 된다)
2. push eflags
3. push cs, push eip
(push 되는 eip는 Fault(예외)의 경우는 fault가 일어난 코드 어드레스,
나머지 예외나 인터럽트의 경우에는 다음 코드 어드레스)
4. 예외의 경우 Error Code가 있다면
4-1. push ErrorCode
5. cs, eip 변경
(인터럽트 디스크립터의 cs, base code offset)
6. eflags 변경
(해당 인터럽트의 디스크립터의 속성이 트랩게이트일 경우 - IE 유지)
(해당 인터럽트의 디스크립터의 속성이 인터럽트게이트일 경우 - IE clear (cli). 즉 프로세서가 더 이상 인터럽트를 받아들이지 않는다.)
##################################
# 인터럽트(트랩) 복귀 시 - iret, opcode:CF
##################################
1. cpl과 스택에 있는 cs를 비교해서 다르면 후에 "4."도 수행
2. pop eip, pop cs
(pop eip 되더라도 아래코드 계속 수행. 4까지 수행 후 fetch 단계로 간다)
3. pop eflags
4. pop esp, pop ss
댓글 없음:
댓글 쓰기