Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

exception이나 interrupt 시 복귀 주소가 상이한 이유는 무엇인가? #48

Closed
libertyjin opened this issue Apr 9, 2016 · 0 comments

Comments

@libertyjin
Copy link
Collaborator

Reference: 007_linux-kernel_20130608.md

오늘 스터디중 이해가 잘 안되는 부분이 있었습니다.
그런데 방금 책 보다가 해결이 되어 공유합니다. 사실과 다른 것이 있다면 과감하게 댓글 달아주세요.^^

image
[표 9.4] 링크 레지스터 기반의 익셉션 복귀 주소

질문은 'IRQ가 발생하면 왜 링크 레지스터에 -4를 빼는가?' 였습니다.

제가 찾은 답은 이렇습니다.

이해를 돕기 위해 ADD, SUB, MOV가 파이프라인에 들어있다고 가정할께요.

| Fetch (LR)  | Decode (LR-4)  | Execution (LR-8) |
|  ADD        | SUB            | MOV              |

파이프라인 동작 특성으로 인해 실행 단계에서 PC는 항상 명령어 주소에 8을 더한 값을 가리킵니다. (34page 인용)
지금 이 순간에는 PC가 ADD의 주소를 가리키고 있습니다.

IRQ 익셉션이 발생하면 하드웨어가 일단 MOV까지는 실행시킵니다.
그런 다음 링크 레지스터에 PC를 넣는 작업까지 해 줍니다.

 r14_irq = PC 

아 그런데 MOV까지 실행 했으니까 SUB로 돌아가야 하는데 링크 레지스터가 엉뚱한 곳을 가리키네요.
보정해 줍시다.

r14_irq = r14_irq - 4

이렇게 해서 왜 링크 레지스터에 -4를 하는지 밝혀 졌습니다.

SWI와 Undefined Exception는 왜 LR을 그대로 쓸까요?
마찬가지로 예를 들어 볼께요.

| Fetch (LR)  | Decode (LR-4)  | Execution (LR-8) |
|  ADD        | SWI            | MOV              |

Software Interrupt가 발생하는 순간의 모습은 이렇습니다.
바로 Decode에 SWI가 걸렸을 때 입니다.
앞에서 본 것 보다 한 클럭 일찍 예외가 발생하네요.

지금 PC는 ADD의 주소를 가리키고 있으니까
앞에서와 같이 -4를 해버리면 무한 인터럽트에 빠질 태니까
LR 레지스터를 그냥 써도 되겠네요. :)

Undefined Exception도 Decode 단계에서 예외가 발생하나 봅니다.
어떤 명령어인지 찾아보다가 "이보게 내 사전에 그 명령어는 없네."하고 발생하는 거니까요.

Data Abort 익셉션이 발생하면 LR에 -8을 빼서 보정합니다.
익셉션을 발생시킨 명령어를 가리키는 것인데 아마도 디버깅을 위해서가 아닌가 싶습니다.

| Fetch (LR)  | Decode (LR-4)  | Execution (LR-8) |
|  ADD        | SUB            | LDR              |
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant