arm 에서 인터럽트의 동작 원리에 대해 궁금한 점..
안녕하세요. arm core의 인터럽트 처리 관련해서 궁금한 점을 적어보려합니다.
arm에서 인터럽트가 발생하면 매핑된 메모리 중 0x0000_0000번지에 위치한
인터럽트 벡터 테이블로 이동하여 해당 인터럽트 벡터를 실행하게 됩니다.
보통, 부트로더는 인터럽트 벡터 테이블을 가지고 있으며 0x0000_0000번지부터
시작하는 것으로 알고 있습니다.
만약, 부트로더와 커널이 다른 형태의 인터럽트 소스를 처리하려고 할때..
즉, 부트로더가 커널을 램에 올리고 그 후 인터럽트 문제에 대해 부트로더에
있는 벡터 테이블과 관계 없이 커널에서 처리하고자 할때는 커널도 벡터 테이블을
가지고 있어야겠지요? 하지만 arm에서는 인터럽트가 발생했을때 0x0000_0000
번지에 있는 벡터 테이블을 참고로 처리하려고 할테고요. 그렇다면 커널의 벡터
테이블을 이용하도록 하기 위해서는 어떻게 해야 할까요?
제가 생각해본 것은 부트로더의 reset벡터 이외의 벡터들이 커널의 벡터테이블을
이용하도록 하기 위해 ldr pc, #(KERNEL_BASE+IRQ_VECTOR_OFFSET)
같은 형태로 작성하면 되는 것으로 생각하고 있습니다.
이런 방법으로 하는 것이 맞을까요? 아니면 부트로더의 벡터 테이블을 고치지 않고
리맵핑 하는 방법이 따로 존재 하는 것인지요?
물론 mmu를 지원하는 core 라면 커널 베이스 주소를 0x0000_0000번지로 리맵
하면 되겠지만, mmu를 사용하지 않는 core에서는 어떻게 하는지 궁금합니다.
remapping을 지원하지
remapping을 지원하지 않는 arm 코어의 경우는 flash메모리의 인터럽트 처리 영역에서 인터럽트 pending비트를 검사해서 어디에서 인터럽트가 발생했는지 검사하고 절대 번지로 지정된 수정가능한 램영역의 해당 인터럽트 백터 테이블을 참조해 분기하게 됩니다. 그러면 사용자는 램영역의 해당 백터 테이블만 갱신하면 인터럽트 루틴을 수정할 수 있습니다.
댓글 달기