임베디드 리눅스 커널 부팅에 대한 궁금증이 있습니다.
글쓴이: teaeune / 작성시간: 화, 2008/09/16 - 12:46오후
임베디드 리눅스 커널의 경우 자신만의 인터럽트 벡터 핸들러가 있다고 알고 있습니다.
그런데 궁금 한것이 Uboot나 기타 부트로더에서는 reset, data abort 등 7개의 핸들러에 대한 처리를 합니다.
인터럽트 발생시 하드웨어 적으로 reset, irq, fiq 등이 발생 하면 0x0000000번지로 pc가 이동 하게 되어서 그러한 핸들러가 처리 되는 것으로 알고 있습니다. 그렇다면 리눅스에서는 이러한 핸들러를 대체를 해서 쓴다는 소리인데 어떤식으로 대체 되는지 궁금합니다.
Forums:
그건 아키텍처마다
그건 아키텍처마다 틀리죠.
보통(?)의 경우는 인터럽트 유닛이 인터럽트 백터의 포인터를 레지스터에 갓고있습니다. 그리고 인터럽트가 생기면 그 레지스터를 참조하여 인터럽트 백터를 읽어 특정루틴을 호출하죠.
자세한건 아키텍처의 인터럽트부분을 읽어보심이... 좋을 듯...
----
궁금한것은 ARM에 대해서 입니다.
제가 장황하게 적어 두어서 의미 전달이 잘못 된것 같습니다.
그러니까 s3c2440 soc 칩을 예로 들겠습니다.
소프트웨어 적인 부분인 부트로더부분과 리눅스 커널부분으로 나눠서 본다면
부트로더 부분에서 인터럽트 핸들러는 0x000000번지에 인터럽트 벡터 테이블이 존재 하는 것으로 알고 있습니다. (reset, data abort, fiq, irq 등등)
그리고 리눅스 커널의 경우는 커널 내부의 인터럽트 핸들러가 포함되어 있는 것으로 알고 있습니다. 그래서 MMU 변환 과정을 거친후 램에서 동작 하는 것으로 알고 있구요. 여기서 궁금증이 발생 합니다.
바로 부트로더 인터럽트 벡터 테이블에서 커널내부의 인터럽트 벡터 테이블로 어떻게 변경이 되는 것인가 하는 것입니다.
이때까지 허접하지만 인터럽트가 발생 하면 하드웨어적으로 0x000000번지로 가서 벡터 테이블 루틴을 타고 어떠한 일이 발생한다고 생각 하고 있었기 때문입니다. MMU 에서 어떤한 일을 해주는 것 같기도 하고, 어떤원리에서 IRQ, FIQ 등을 램에서 처리 할수 있는 것인지요??
뭐 아직 자세한건 잘 모르지만..
리눅스 커널의 이해 책을 보면 그런 내용이 나오니다만, 저도 완전히 다 읽지 못해서 간단히 이야기합니다.
일단 아키텍처 의존적으로 말하자면, 인텔 플랫폼에서의 리눅스 커널에서 인터럽트 벡터테이블도 역시 메모리에 저장이 됩니다. 자 그럼 어떻게 그걸 사용하느냐?
인텔 아키텍처의 경우 시피유에 어떤 레지스터가 바로 이 인터럽트 테이블을 (IDT) 를 가리키는 주소를 담게 됩니다. 이 레지스터는 한개가 될 수도, 여러개가 될수도 있습니다. 이 레지스터를 사용하여 인터럽트 발생시 이 레지스터를 따라 IDT를 찾아내어 그 테이블에서 인터럽트 핸들러를 찾아 수행하면 되지요. 결국 부트로더에서 운영체제로 변경시에, 해당 레지스터를 운영체제가 초기화한 IDT 테이블의 주소로 변경하면 간단히 IDT가 변경이 되는거지요..
마찬가지로 ARM에도 이러한 역할을 하는 레지스터 같은게 있을거라고 생각합니다.
부트로더는
부트로더는 부트로더대로 irq벡터 테이블을 초기화하고, 부트로더가 불러온 커널도 불려온후에 처음 초기화코드에서 자신이 필요한대로 irq벡터 테이블을 초기화합니다.
커널이 불려와서 실행중의 벡터 테이블은 부트로더의 벡터 테이블과는 다르게 되어 있습니다.
아마 부트로더가 초기화해놓은 벡터 테이블이 커널이 로딩->수행되는 단계에서까지 계속 유지되는것으로 착각하신 모양입니다. 부트로더는 부팅시에만 이용되므로 커널이 불려온 다음에는 쓸일이 없습니다.
(중대한 에러 발생시 부트로더가 다시 불려서 초기화되도록 만든 시스템의 경우만 빼고. 물론 이런 경우에는 부트로더 초기화코드가 다시 인터럽트 벡터 테이블을 자신에게 할당된 내용으로 초기화함)
Available only from the dark side.
you must know the power of dark side.
음...검색하다가
임베디드 리눅스에 대한 좋은 정보가 여기 있네요..
잠깐 참고겸 보시면 도움 되실듯 해요
http://www.ibm.com/developerworks/kr/library/tutorial/l-dw-linux-embedded-distro-i.html
밑바닥부터 시작하는 임베디드 리눅스라네요..
댓글 달기