본문 바로가기
Kernel을 Porting 한다는 것

Porting한다는 것은 도대체 무엇일까. 처음에 이 일을 시작했을 무렵, 다들 Porting한다는 단어를 자연스럽게 쓰는 걸 보고 - 자네 요즘 뭐하나? 아, 예 저는 지금 Linux Kernel을 우리 Target에 Porting중입니다. 어, 그럼 자네는? 아, 예 저는 L4 Kernel을 우리 Target에 porting중입니다. 음음 그렇군. 다들 바쁘구먼. 음음 - 난감해 하며, 도대체 뭘 하고 있다는 거지? 라는 의문에 휩싸인 적이 있스므니다. Porting을 한다는 건 참으로 어떤 일일까 궁금해 마지 않을 수 없었는데, 얼마간 지나서 그 궁금증을 풀 수가 있었지요. 별거 아니더군요. ㅋ
 
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을 할 수 있는 기본 자세가 되었다고 보시면 무리 없다고 봐야 하지 않을까 싶습니다요.

친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -