본문 바로가기
3. 개발 관련/정리 :: issue 와 resovle

리눅스 커널과 모듈 빌드

by kyuho.choi 2010. 4. 14.
728x90
반응형

이전에 강의를 수강하시던 분들께서 종종 질문을 주시는 데,

어제는 조금 쓸만한 질문이 들어왔으므로 정리한번 하고 넘어가고자 한다.

 Q. 커널 빌드시에 빌트인의 의미는 무엇인가? 
     확인하는 방법은 무엇인가?
     모듈 빌드 및 설치는 어떻게 확인가능한가?
     타깃 시스템에 포팅은 어떻게 해야하는가? 

대충 위와 같은 질문 이었는데, 예를 들어 살펴보도록하자.

===================================================================================================
 리눅스 커널 configure 할 때 사용되는 옵션은 3가지로 정리될 수 있으며,
각각 다음과 같다.

 - (*) : built-in
 - (M) : Module
 - ( ) : not built

 커널을 빌드(모듈 빌드 및 설치 포함)하는 과정은 다음과 같다.

- make menuconfig : 빌드할 커널의 configure 로 리눅스에서는 소스 프로그램들을 설치할 때 대부분 configure 를 통하여 해당 소스의 빌드 타입을 설정하고 make 를 이용하여 configure 로 설정한 옵션대로 소스 프로그램을 빌드한다. 이는 커널도 마찬가지이다.

make zImage -j5 : 위의 configure 대로 zImage 를 빌드하는 것을 의미한다. 이 때 모듈로 설정한 옵션들은 zImage 내에 포함되지 않는다. 이들은 아래의 명령들을 통하여 빌드 및 설치되어진다. -j5 옵션은 멀티코어 환경에서 빌드할 때 보다 빠른 빌드를 위하여 사용한다.(쿼드코어의 경우 -j5 가 가장 빠르다는 이야기가 있다)
(*) 로 설정한 빌트인 옵션들이 이때 컴파일되어 zImage를 생성한다.(물론 다이렉트로 zImage가 뽑아져 나오는 것은 아니며 일련의 과정들을 거쳐 zImage가 생성된다)

make modules : (M) 으로 설정한 모듈 옵션들이 빌드된다. 이들은 각각 .o 또는 .ko 등과 같은 오브젝트 및 커널 오브젝트를 생성하며(각 소스들이 위차한 디렉토리의 makefile에 기준하여 오브젝트들을 빌드한다.) 해당 오브젝트 파일들은 소스들이 위치한 디렉토리에 생성될 것이다.

make modules_install : 빌드한 모듈들의 설치가 이루어 진다. 타깃 시스템에 대한 모듈 인스톨이던, 호스트 시스템을 위한 모듈 인스톨이던 모두 동일한 위치에 설치되며 다음과 같다. 

prefix = /lib/modules/`uname -r`/kernel 
===================================================================================================

그럼 다시 질문으로 돌아가서 예제를 통해 확인을 해보자(물론 예제를 만든다는 것은 아니고... 커널을 이용해서 -ㅅ-;;)

확인해보고자 하는 실험환경의 개요는 다음과 같다.
 - 호스트 시스템 커널
 - 드라이버 소스를 이용한 커널 빌트인 및 모듈 컴파일
 - 설치 경로 확인 및 System.map 확인


* 모듈 옵션으로 빌드하기



위 그림을 보면 키패드 드라이버를 모듈로 설정하여 커널을 빌드한다. (커널 빌드는 건너뛰도록하자)


이를 빌드 하려면 make modules 를 실행해야 하며, 결과는 다음과 같다.

* 모듈 빌드 및 결과 확인



모듈 설치는 건너 뛰겠다.
위를 make moduels_install 을 이용하여 빌드하면 호스트 시스템의 /lib/modules/kernel 디렉토리에 동일한 .ko 파일이 생성되는 데 호스트 시스템을 드럽히기 귀찮다잉 -ㅅ-;;

* Sysyem.map 확인하기
앞서 커널 빌트인과 모듈의 차이 등을 확인하려면 System.map 을 확인하라고 언급하였다. 위 키패드 드라이버 소스에는 aesop... 이라고 하는 심볼들이 있으며, zImage 생성시 해당 드라이버를 빌트인으로 컴파일하였다면, System.map 파일에서 심볼을 확인 할 수 있을 것이다(즉 커널에 포함되었다는 의미이다.)

그래서 모듈로 빌드한 커널의 System.map 을 확인해보면 다음과 같다.


하단을 확인해보면 aesop으로 시작하는 모듈 심볼이 System.map 에 없는 것을 확인할 수 있다.
당연하게도 (M) 옵션으로 설정하여 빌드했기 때문이다.

이와는 반대로 make menuconfig 에서 (*) 빌트인 옵션으로 빌드한 경우를 보도록하자.

* 위 과정은 생략하고 단순하게 System.map 만 확인하자.


드라이버를 커널에 빌트인하여 zImage 를 생성한경우, System.map 파일에 해당 드라이버의 모듈 심볼이 위와 같이 등록되어질 것이다. zIamge 는 위 System.map 파일을 이용하여 해당 모듈들을 부팅시에 로딩 및 재배치를 해야하니까...

===================================================================================================

준비한 내용은 여기까지 ...

다 아는 사람들에게는 뻔하디 뻔한 기본적인 내용일 수 있으나, 기본은 언제나 중요하다 -ㅅ-;
728x90
반응형

댓글