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
반응형
댓글