0. Intro
Linux kernel에 관계된 directory들에는 Kconfig와 makefile이 함께 존재한다.
※ Makefile : 파일을 생성하는 스크립트.
obj-변수(CONFIG_XX_*) 의 값이 y라면 해당 *.o 파일을 오브젝트 파일로 만들겠다.
변수 위치 : 최상위 디렉터리 안 (Kconfig를 참고해 .config 파일은 자동으로 생성됨)
1. configuration files
1.1 Kconfig
Kconfig: kernel에 대한 설정에 대해 정의되어있는 파일을 의미
make menuconfig를 했을 때, 보이는 화면은 Kconfig파일에 대한 내용들이다.
1.2 defconfig
defconfig: driver 단의 Makefile을 보면 아래 같이 작성되어 있는 것을 볼 수 있다.
그런데 menuconfig를 사용해 일일히 설정하지 않고, defconfig라는 것에 필요한 설정들을 정의해 놓고 사용 할 수있다.
1.4 .config
.config: make menuconfig 파일 기반으로 생성된다.
make menuconfig를 하면 기본적으로 arch에 맞는 defconfig를 가져와서 세팅한 후, 사용자의 추가 세팅을 받아서 최종 .config 파일이 완성된다.
.config 파일이 최종적으로 빌드 시 사용된다.
2. Kconfig 용어 정리
1. bool
config =y/n로 지정
즉 , FEATURES을 define 할지 undefine 할지 정하라는 뜻이다.
2. default
메뉴 엔트리의 기본 값을 정하는 명령어
3. depends on
현재 메뉴 엔트리의 종속성을 설정하는 명령어
즉, 다른 FEATURES이 선택되면 현재 메뉴 엔트리가 활성화 되게끔 하는 명령어이다.
예 )
[순서]
1) FEATURES_HELPER 활성화
2) FEATURES 활성화
4. select
역종속성을 설정하는 명령어
현재 메뉴가 설정되면 다른 메뉴 항목도 활성화 될 수 있다.
예 )
[순서]
1) FEATURES 활성화
2) FEATURES_HELPER 활성화
Kconfig, Makefile, defconfig
얘네들이 리눅스 시스템 개발 처음 시작할 때 가장 헷갈리고 가장 영향을 많이 줬던 녀석들이었다.
지금 생각해 보면 정말 별거 아닌 것 들인데 -..- 책에는 뭔가 어렵게만 적혀 있었던게 기억난다.
간단히 집고 넘어가보자
Makefile
말 그대로 파일을 생성하는 스크립트다. 예제를 하나 보자면
obj-y += gpio/
obj-$(CONFIG_GPIO) += gpio/
obj-y 의 y는 yes 라는 말로 gpio 폴더 내의 .o 파일들을 오브젝트 파일로 만들겠다 그 소리다. 참고로 / 가 붙어있는건 폴더라는 뜻이고 파일 한개만 지정하고 싶을 땐 .o 를 붙여주면 되겠다.
obj-$(CONFIG_GPIO) 는 뭐냐면 $(CONFIG_GPIO) 가 일종의 define 인데 이 define 이 바로.config 에 명시되어 있다. 음 근데 갑자기 .config 는 또 뭘까
.config 는 최상위 디렉토리 안에 위치하고 소스 안에는 이런것들이 명시되어 있다.
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.35.7
# Thu Jul 28 18:03:53 2011
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_HAVE_SCHED_CLOCK=y
CONFIG_GENERIC_GPIO=y
CONFIG_GENERIC_TIME=y
맞다. 위에서 본거다. CONFIG_GPIO 도 여기 어딘가에 정의가 되어있다.
그럼 .config는 어떻게 만드는걸까-
자동으로 만들어진다..
대신 Kconfig 를 참고해서-
다시 말하면 각 모듈마다 있는 Kconfig 에 y로 해놓을지 n을 해놓을지 명시를 해 놓으면 컴파일 될 때 자동으로 취합해서 하나의 파일인 .config 에 써지게 되는 것이다. 이 .config 는 다시 autoconf.h 라는 파일로 최종적으로 만들어 지게 된다.
Kconfig 에 대한 자세한 설명이 있는 블로그 : http://blog.daum.net/chazzing/20
자 다시 정리하자면 .ko 파일을 만드려면 Makefile 에 명시를 해줘야 하는데 그냥 y로 되있지 않고 $(CONFIG_XXX)라고 되어있으면 Kconfig에 가서
config GPIO
bool
default y
이렇게 해줘야지 된다. (참고로 Kconfig 에 config GPIO 라고 해 놓으면 .config 만들어 질 때 CONFIG_ 가 앞에 자동으로 붙게 되어있다.)
근데 보통 개발할 때 보면 FEATURE 처리가 되어 있을 때가 많다. 아래 처럼
if MSM_DEVICES
config GPIO
bool
default y
endif
if 문이 하나 붙은걸 볼 수 있다. if 문이니까 MSM_DEVICES 가 true 일 경우에 아래 문장이 실행 되겠지-
말하자면 먼저 한번 걸러 주는 것이다.
암튼 저런 것을 FEATURE (피처) 처리 해준다고 하는데 요놈들은 defconfig 라는 파일에 명시되어 있다. 보통 kernel/arch/arm/config 폴더에 위치한다.
defconfig 라고 다를건 없다. y 로 해주든지 n 로 해주든지 그건 개발자 맘이다.
암튼 저렇게 해서 obj 파일에 포함이 되면은 최종적으로 .ko 파일이 만들어지게 된다. 뭔가 많이 길어졌네
책에 보면 Makefile 의 문법같은게 자세하게 나와있는데 내 생각엔 이정도만 알아도 드라이버 올리는덴 문제가 없다
[출처] Kconfig, Makefile, defconfig|작성자 영승
원본 위치 <http://blog.naver.com/PostView.nhn?blogId=areema&logNo=60135756070>
Kconfig 명령어 정리[1]
다음의 내용은 지극히 개인적인 경험을 토대로 작성한 것이므로, 사실이 아닌 내용이 들어 있을 수 있음을 감안하여 참고 하시길 바랍니다.
분석하고 있는 커널 버전은 2009-07-14일 현재 가장 최신 버전인 2.6.30.1이다.
커널 소스를 분석하려면 많이 접하는 것이 바로 Kconfig 이다.
Kconfig 명령어 들은 상당히 직관적이지만, 처음 접하게 되면 멍한 기분까지 들곤한다.
Kconfig 에 사용되는 명령어들을 커널으 분석하면서 나오는 순서대로 정리 해 보고자 한다.
#1. mainmenu
예> mainmenu "Linux Kernel Configuration"
--> mainmenu 뒤에 있는 문장을 타이틀 로 사용한다. 이게 무슨말이고하니...
make menuconfig 를 실행 하였을때 파란 파탕에 회색 창이 뜨는데 회색창의 타이틀로 여기서 지정한 문장을 쓰겠다는 얘기가 되겠다.
#2. config
예> config ARM
--> Kconfig 파일에서 가장 많이 볼 수있는 명령어이다. 그도 그럴것이 이 config란 것이 menu entry 를 정의 할때 쓰는 것이기에 가장 많이 나오는 것이 당연하다 할것이다. menu entry 란 커널 옵션 항목을 말한다. config 뒤에 붙은 ARM은 feature 명이다. 이는 또 무슨 말이고 하니.... config ARM 이라는 커널 옵션 항목을 만들었다면, 결국 만들어 지는 feature는 CONFIG_ARM 이라는 feature 가 만들어 진다. 또 feature가 또 무었이냐라고 한다면 주로 #define 문으로 정의되는데 어떤 코드를 상황에따라 넣어다가 뺐다가 할수 잇도록 하는 용도로 사용되어 지는 것인데..... 마찬가지로 커널에서도 필요한 항목만 넣기 위해서 이 방법을 사용한다. 설명이 장황해 졌는데......
config ARM 에 대한 코드를 알고 싶으면..
linux-x.x.x>grep -w "CONFIG_ARM" ./ -rn
을 실행하면 사용한 위치가 보이고.. 그중에서 눈여겨 볼 파일이
include/linux/autoconf.h 이다.
이 파일은 make menuconfig 나 혹은 다른 방법으로 .config 파일이 생성되면 최종적으로 만들어 지는 파일인 것이다.
보통 config 문은 이러한 구조로 되어 있다.
config EXAM
bool "Exam Menu"
default y
depends on MODULES
select TEST
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
config 이후의 문장들은 메뉴 속성을 지정하는 부분이다.
#3. bool
메뉴 속성에서
bool "Set version information on all module symbols"
는 메뉴타입을 지정하는 것이다.
여기서 bool 은 tristate / string / hex / int 가 될 수 있으며
bool 은 두가지 상태 즉 yes/no, true/false, 등과 같은 것들을 지정....
tristate는 세가지 상태, Y / M / N 즉 커널에 넣기 / 모듈로 넣기 / 빼기 이다.
string 은 스트링을 입력 받으 수 있는 타입이며 마찬가지로 hex int 는 각각 hexa 와 integer 값을 입력 받는 타입이다.
#4. prompt
모든 메뉴엔트리는 하나의 prompt를 가진다. prompt 라는 것은 사용자가 볼수 있도록 화면에 출력시켜주는 문자열이다. 즉 메뉴상에 나타나는 문장이다.
하지만 이 prompt 는 생략 가능하므로, 위의 예는
bool "Exam Menu" 는
bool
prompt "Exam Menu" 과 같은 의미이다.
#5. default
메뉴 엔트리의 기본 값을 정하는 명령어 이다.
#6. depends on
현재 메뉴엔트리의 종속성 설정하는 명령어 이다. 종속성이라.... 쉽게 말하자면 , "나는 철수가 학교가면 나도 갈것이다"라고 생각하면 되겠다. 즉 다른 feature가 선택이 되면 현재 메뉴 엔트리가 활성화가 되게끔하는 명령어이다.
위의 예에서
depends on MODULES
은 MODULES 가 yes , active , on 등 긍정적인 설정이 되면 현재 메뉴 엔트리가 활성화 된다는 것을 의미한다.
#7. select
역종속성을 설정하는 명령어 이다. 역종속성.. 영어로는 ,reverse dependencies 라고 한다. "내가 학교가니깐 영희도 철수도 학교간다." 정도로 생각하면 정확한다. 즉 현재 menu가 선택되면 다른 메뉴 항목도 선택 되게끔 설정하는 명령어이다.
역종속성이라는 말처럼.. 잘못하면하면 종속성을 거스르는 문제가 발생하기도 한다.
즉 A에 종속 되어 있는 메뉴가 A가 on 되기 전에 select 명령어로 활성화가 될수도 있다는 말이다.
그래서 select는 주로 non-visisible symbols 과 종속성이 없는 것에 일반적으로 사용되어 진다.
원본 위치 <http://iggeak.tistory.com/19>
Kconfig 명령어 정리[2]
Notice> 다음의 내용은 지극히 개인적인 경험을 토대로 작성한 것이므로, 사실이 아닌 내용이 들어 있을 수 있음을 감안하여 참고 하시길 바랍니다.
분석하고 있는 커널 버전은 2009-07-14일 현재 가장 최신 버전인 2.6.30.1이다.
#1. Menu Structure
Kconfig의 메뉴는 tree 구조이다. 즉 현재 메뉴를 선택하면 하위 메뉴로 다시 들어 가고 또 다른 메뉴를 선택하면 하위 메뉴로 들어 가고....
메뉴를 구성하는 방법은 두가지 방법이 있다.
첫번째 방법은
menu "Network device support"
depends on NET
config NETDEVICES
...
...
config WIFI
...
...
endmenu
즉 menu로 시작하고 endmenu로 끝나면 된다. 참 쉽죠잉~~~
상위 메뉴항목이 Network device support 이고 하위 메뉴가 NETDEVICES 와 WIFI 이다.
여기서 하위 메뉴들은 상위 메뉴의 종속성을 상속 받는다. 즉 상위메뉴가 NET에 종속이면 하위 메뉴 NETDEVICES 와 WIFI도 NET에 종속된다.
두번째 방법은 종속성을 이용하는 방법이다.
만약 메뉴 엔트리가 이전 메뉴엔트리에 종속 되어있다면 , 현재 메뉴는 이전 메뉴엔트리의 하위 메뉴가 된다.
예를 들면
config PARENT
bool "Parent menu"
config CHILD
bool "Child menu"
depends on PARENT
comment "Parent not support"
depends on !PARENT
이렇다면
만약 PARENT가 활성화되면 CHILD 메뉴가 보이고
PARENT가 비활성화되면 comment가 보이게 된다.
이렇게하면 parent가 활성화되면 child 메뉴가 보이는 아주 user friendly한 모습을 보여준다.
Kconfig 명령어 정리[3]
#1. menuconfig
menuconfig란게 있다. 이것은 config와 똑 같다. 단지 다른점은
메뉴를 선택하고 하위 메뉴가 넘어 갔을때 상위 메뉴의 prompt가 즉 메뉴 문장이 상단에 항상 나타난다는 것만 다르다... 커널의 menuconfig 를 따라가다보면 여기가 어딘지 길을 잃을때가 있는데, 이 를 사용하면 조금이나마 예방이 되지 않을까나~~
#2. choice
여러항목중에서 하나만을 선택하는 하위 메뉴를 만들어 준다.
choice
<choice options>
<choice block>
endchoice
#TIP
실제로 defconfig 피처링 적용된거 확인할려면 빌드 후 하기 경로에 생성된
.config파일을 확인해야함
out-xxx/target/product/xxx/obj/KERNEL_OBJ/ .config
'Embedded : : Linux > : : Linux Kernel' 카테고리의 다른 글
Linux Kernel Image Header - ARM64 (1) | 2024.11.07 |
---|---|
Linux Module (0) | 2024.11.06 |
커널 로그 분석: WARN 매크로 (0) | 2024.10.31 |
Debugging the kernel using Ftrace (4) | 2024.10.24 |
태스크 디스크립터: 프로세스 간 관계 (0) | 2024.10.12 |