Link : http://recipes.egloos.com/5100880


임베디드 시스템에 입문해서 kernel을 포팅한다는 말을 많이 사용했던 것 같다.
그런데 막상 생각해보니 그 의미를 정확히 알고 있지 못했다.
친절한 임베디드 시스템 개발자 되기 강좌에서 간단하게 그 의미가 정리되어 있었다.
아래는 스킵한 내용이다.



Porting을 한다는 것은 이미 만들어져 있는 Software를 우리가 만들려는 Target에 동작할 수 있도록 잘 수정을 한다던가, 특정 Routine을 만든다던가 해서 Target에서 잘 동작할 수 있도록 만드는 걸 Porting이라고 부르더군요. 그러니까, Kernel을 만들기에는 시간이 부족하고, 돈도 많이 들고 하니까, 이미 만들어져 있는 Kernel을 우리의 Target에 제대로 동작하도록 만들고 있다는 뭐 그런 의미였던 것이었었던 것이죠.
 
그러면 만들어져 있던 Kernel을 우리의 Target에 제대로 동작하게 한다는 건 또 어떤 의미냐 하면, Linux Kernel을 예를 든다면, Linux Kernel은 Software  그 자체로서 어느 CPU든지 Compile만 새로 한다면 동작할 수 있도록 구성되어 있는데 고로 범용성이 높은 C로 짜여져 있는 경우가 대부분이에요. C는 많은 CPU들에서 C compiler를 제공하니까, 그냥 가져다가 우리 Target에 맞는 Compiler로 다시 Compile만 하면 되는 거죠. 그러면 어느 부분을 작업을 해야 Porting한다고 제대로 말할 수 있는 걸까요.
 
뭐 크게 예만 든다면,
ⓐ Interrupt Lock/ Unlock을 하는 방법은 CPU마다 다르겠죠.
ⓑ Context Switching 할 때 Backup 해야 하는 Context는 CPU마다 다르겠죠. (Register들이 CPU마다 다 천차만별일 테니까요.)
ⓒ Stack이 자라는 방향은 CPU마다 Compiler option마다 다르겠죠.
ⓓ SWI를 호출하는 방법이 CPU마다 다르겠죠.
ⓔ Interrupt가 걸린 후 처리 되는 방법도 CPU마다 틀리겠죠.
ⓕ 특히나 ARM같은 경우에는 Mode마다 사용되는 Stack도 따로 있으니 이 부분도 수정되어야 하고요.
ⓖ Watch dog Timer도 MCU마다 다른 시간 설정일 테니 이 부분도 잘 봐줘야 할 것이고요
.
 
뭐 이런 부분들이 따로 새로 만들어 지거나, 우리 Target에 맞도록 수정되어야 기존에 만들어져 있던 Kernel을 우리가 Target으로 하는 CPU에서 동작할 수 있도록 할 수 있는 것이죠. Kernel을 Porting하는 작업은 쉬운 작업이 아니에요. Kernel이 어떻게 동작하고 있는 지와, 우리가 Target으로 생각하는 CPU가 어떻게 동작하는지를 잘 알아야 가능한 일인 게죠.
 
어떤 특정 Kernel을 잡아서 어떻게 Porting 한다는 걸 보여주는 건 의미가 있을지도 모르겠습니다만, 저 같은 경우에는 관심 없는 Kernel 잡아서 보여주는 건 별로 흥미도 재미도 없더라고요. 위의 ⓐ~ⓖ 같은 것들을 들여다 봐야 한다만 알아도 Porting을 할 수 있는 기본 자세가 되었다고 보시면 무리 없다고 봐야 하지 않을까 싶습니다요.
Posted by eoseontaek