● 들어 가면서

포럼에 예고편까지 올린
아주 아주 요란스러운 광고에 걸 맞는
작업 진행 속도를 보이고 그에 따른 글을 정리해 올려야 하는데

공사 다망한 사건 사고가 있는, 원래 생각보다 바쁜 나날이 지나고,
그렇지만 돈 버는 것과는 썩 관련이 없는 하루 하루를 지내다 보니
글 하나 올리지 못한 남사스러운 상태가 되고 말았네요

그래도 꿋꿋하게 한 가지씩 진행해 보죠.

참! 저 따라 했을 때 질문 댓글은 허용하지만 저의 답변은 가급적 기대하지 마세요.

제 원칙 중 하나가 질문에 답변 잘 안 하기 입니다.
뭐 솔찍하게 말하면 답변했다가 실력이 뽀록 날까 봐 그렇습니다. 이해해 주세요

● 커널 포팅이란?

임베디드 리눅스를 처음 하시는 분들을 가끔 만나서 이야기 하다 보면

“나 진짜 아무것도 모르는 초짜예요”

라고 하는 눈빛을 하고 초롱 초롱한 눈망울로 저를 바라보시면서

“커널 포팅이 뭐예요?”

라고 물어 보시는 분들이 있습니다.

이때 저는 아주 친절하게 최대한 이해할 수 있도록 설명하기 위해서 이렇게 이야기 합니다.

“임베디드 시스템에 사용되는 컨트롤러 보드에 리눅스 커널을 올리기 위해서 제어 시스템에 맞도록 리눅스 커널의 아키텍쳐 부분 소스와 각 종 하드웨어 제어를 위한 디바이스 드라이버 소스를 어드레스 및 인터럽트 부분 등을 수정하고 초기 부팅 부분을 부트로더와 맞추어 가는 과정입니다.”

물론 이 말을 하는 순간 저는 초보 분들이 잘 이해했을 것이라는 기대를 갖고서 말이죠.

하지만 그 분들의 표정을 보면 절망합니다.

그 분들은 초보 분들이거든요..

임베디드? 컨트롤러? 아키텍쳐? 디바이스 드라이버? 부트로더?

제 설명은 좀 더 이해 못할 단어들의 나열인 거죠..

옛날 제가 처음 임베디드 리눅스 처음 시작 했을 때 처럼요.

이런 절망적인 상황에 그 초보 분들보다 약간 좀 일찍 하신 분들이 이렇게 이야기 하여 저를 구제해 주십니다.

“그러니깐요.. 유영창씨가 말한 것을 쉽게 이야기 하면요”
“보드에 리눅스가 동작하도록 하는 작업을 커널 포팅이라고 하는 거예요”

그 순간 그 초짜 분들은 정말 알겠다는 눈빛을 반짝입니다.
“그런거 군요”..

저 절망 합니다.

● 커널 포팅의 수준

그.렇.죠.

다른 장황한 설명은 굳이 필요 없는 겁니다.

자기가 원하는 리눅스 커널이 보드에서 동작하도록 하는 모든 작업이 커널 포팅인 거죠.

그런데 이런 커널 포팅에도 난이도가 있는 겁니다. 가장 난이도가 낮은 것에서 높은 순으로 보자면 다음과 같은 순서가 될 것 같네요

    ▶ 보드 포팅
    ▶  MPU 포팅
    ▶  프로세서 코어 포팅
    ▶  새로운 프로세서 추가 형태의 포팅

저..
혹시..
나중을 위해서 말하는 건데요..
리누즈 아저씨가 구분한 것은 아니고요

제 나름대로 구분한 거니까.

자신의 생각과 다르다고 딴지 걸지 마세요…

● 보드 포팅

이번에 포럼에 올리겠다고 하고 진행하고 있는 2.6.28 커널을 저희 회사 보드에 포팅 하는 것이 가장 낮은 난이도를 갖는다는 보드 포팅입니다.

왜냐하면 2.6.28 커널은 현존하는 대부분의 임베디드용 프로세서에서 동작 하도록  수정된 상태이고 상용화된 보드들은 표준적인 보드의 하드웨어 설계 부분에서 몇 가지 부분만 살짝 고쳐 놓거나 추가 한 정도거든요.  이 정도는 커널 소스를 수정하고 적용하는 것이 크게 어려운 부분은 아니죠.

아..

그렇다고 쉽다고 오해하시면 안됩니다.

저희 회사가 먹고 사는 데는 다 이유가 있습니다.

그냥 똑같이 만들거나 추가된 부분이 없다면 그냥 쓰면 되지만 하나라도 틀리거나 하드웨어적인 트러블이 있거나 하면 리눅스 커널 특히 디바이스 드라이버나 아키텍쳐에 대한 이해가 없는 상태에서는 손 쓸 방법이 별로 없다는 거지요.

저희 회사가 그동안 10년 가까이 임베디드 리눅스만 다루고 그 과정에서 얻어진 리눅스 커널에 대한 이해와 경험이 평범한 것은 아니라는 겁니다.

흠흠….

힘들면 저희에게 맡겨 주십시오.
시간을 절약할 수 있을 겁니다.

흠흠.. 광고 였습니다. ( 이 구차한 먹고사니즘이여~~ )

● MPU 포팅

그럼 이 보다 조금 더 어려운 단계는 무엇일까요?

그건 프로세서 코어의 핵심은 같은데 기존에 없던 MPU를 커널에 추가 하는 것입니다.

예를 들면 예전에 삼성 S3C2410 프로세서가 이미 커널에 있는데 S3C2440 을 새로 개발했을 때 리눅스 커널에 이를 추가 하는 것이죠

이때는 단순한 보드 포팅이 아니죠

ARM 프로세서 계열이라면 머신 아키텍쳐 라고 하는 부분을 추가 하는 작업입니다.

이 작업은 새로운 주변 장치들을 기존 프로세서 코어와 연관하여 추가 하기 때문에생각보다 많은 작업이 필요한데 이건 주로 프로세서를 만드는 회사에서 자체적으로 하거나 저희 같은 회사에 발주를 주는 일이죠

근데 왜 우리에게 그런 일들을 안 줄까요?  전문인데 말이죠..
삼성전자가 저희를 싫어 하나 봅니다.  아하하하….

일반 회사에서는 이런 일들이 발생하지 않겠죠.

기존 리눅스 커널이 지원하지 않는 특별한 MPU를 임베디드 리눅스에 써야 할 경우인데

MPU 포팅 이거 의외로 시간 많이 걸리고 저희 같은 회사에 외주 주려고 해도 돈 많이 주어야 합니다.

그래서 일반 회사가 MPU 포팅을 하고 싶다는 문의를 하시면 저희는 그냥 리눅스 커널이 지원하는 MPU 사용하라고 권장 합니다.

그게 일반 개발자들이 만수 무강하는 지름길이죠..

그래도 부득히 하신다면야 저희는  감사 하죠 돈 주신다는데 하하하…

● 프로세서 코어 포팅

그 다음 난이도가 높은 것은 새로운 프로세서 코어 를 포팅하는 겁니다.

프로세서 코어 포팅을 하려면 커널 내부의 핵심 부분이 스케쥴러 , 가상 메모리 시스템, 인터럽트 처리 , 기존 아키텍쳐 커널 소스 부분 등을 이해 해야 하고
프로세서의 캐쉬 시스템이나 MMU 와 같은 것과 같은 부분에 대한 이해도가 높아야합니다.

사실 위에 이야기 한 커널 내부의 가장 어렵다는 메모리 관리 부분과 인터럽트 부분 캐쉬 컨트롤 등등 쉽지 않죠…

어쨌든 이런 부분의 포팅은 아주 특별한 경우가 아니면 다룰 일이 거의 없을 겁니다.

ARM 사에서 저희 회사에 외주 주려고 마음 먹을 경우라면 모를까 …

하하… 있을리가 없지요

아니면 듀얼 코어와 같은 SOC를 다루어야 하는데 외국에서 요구하는 비용이 너무 비싸서 한국에서 찾아 본다면 모를까..

그냥 있다고만 하지요..

● 새로운 프로세서 추가 형태의 포팅

역쉬 가장 난이도가 최고라면 기존에 없는 프로세서 아키텍쳐를 추가 하는 경우죠..

예를 들어 여러분이 아예 새로운 ARM,MIPS,IA32,POWERPC,AVR 과 같은 새로운 프로세서 아키텍쳐를 디자인하고 이를 리눅스에 적용시켜야 겠다고 하는 경우죠.

이런 형태의 포팅이 가장 어려운 이유는
다른 프로세서를 참조하면야 되겠지만 전체적인 구상과 설계 기준을 모두 정해야 하기 때문이죠..

아시는지 모르겠지만 리눅스 커널은 사실 리더가 따로 없습니다.
새로운 신천지를 개척할 때는 가장 처음 디자인 해 가는 사람이 모든 것을 정합니다.

그래서 어렵습니다.

잘못되었다고 알려주거나 참조 할만한 것이 없으니깐요..

그래서 가장 어렵습니다.