항상 찝찝한 부분이였는데, 역시 여기계신분들에게 답을 구할 수 있을 것 같네요 ㅎㅎ
Kernel Source에 보면, #ifdef CONFIG_VOLUNTARY_PREEMPTION 이와같이 조건부 컴파일이 있는데,
저 조건부 컴파일을 인터넷 여기저기 뒤지면서 결국 kernel voluntary preemption 의 의미를 가지고 있다는 걸 알았습니다.
위와 같은 조건부 컴파일을 쉽게 찾아내는 방법을 알고 싶습니다.
우선 쉘 스크립트를 이용해서 다음과 같이 쉘을 구성했습니다.
#cat /bin/mkcscope.sh
#!/bin/sh
rm -rf cscope.files cscope.files
find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print > cscope.files
cscope -i cscope.files
그리하여, Kernel Source를 분석하기 위해 다음과 같이 태그들을 형성했습니다.
#ctags -R; mkcscope.sh
위와 같이 했음에도 불구하고, 조건부 컴파일과 관련된 링크는 생기지 않더군요 ...
아마 Makefile 부분과 관련이 있을 것 같은데, 좋은 팁좀 전수해주십시오 ~~!!~!
또 위 처럼 만들고 나니 ... 있는것이란 모든 있는 것은 죄다 연결이 되버려서 ...
도대체 어떤것을 호출하는지 감을 잡을수가 없을때가 있습니다 ...
실제 커널이 동작하는 것과 관련된 tag를 만들려면, 어떻게 해야하는 것인가요?
가령 참조 연산에 의한 write 연산이 일어나게 되면, 함수 포인터 형식으로 동작해서 어떤걸 써야할지도 모르겠구 ... 골치가 아픕니다.
조건부 컴파일에 쓰이는 define들 'CONFIG_xxx"는 커널 컴파일 설정에 따라 정의됩니다.
커널 컴파일 설정은 주로 'make menuconfig'에서 하게 되죠.
커널 컴파일 설정 내용은 커널 코드 최상위 디렉토리의 '.config' 파일을 보시면 되고, 실제 #define 은 'include/linux/autoconf.h'에 되어있습니다.
커널 컴파일 시점에 설정된 define에 따라 커널 이미지를 생성하구요. (조건부 컴파일에 묶여 있지 않은 코드는 이미지에 포함되지 않죠.)
그래서, 커널 분석하실때 타겟 아키텍처와 같이 범위를 정하시고 분석하셔야 합니다.
현재 사용하시는 PC에서 동작하는 커널 코드를 분석하시겠다면, 먼저 커널을 컴파일해서 설치하시고 tag는 다음과 같이 생성하시면 됩니다.
make tags ARCH=x86
make cscope ARCH=x86
이렇게 하면 x86 아키텍처를 기반으로 tag가 생성됩니다. 그러면, 아키텍처마다 다르게 정의된 함수들을 x86 아키텍처용 함수만 tagging 합니다. 위와 같이 tag를 만드시면 모든 아키텍처 코드를 tagging 해버리기 때문에, 분석하는데 불편한 부분이 있습니다.
tag 만드신 후에, 조건부 컴파일의 defind 이 정의된 부분(ctrl+])이 없으면 'include/linux/autoconf.h'에 #define 되지 않은 것이요, 정의된 부분이 있으면 'include/linux/autoconf.h' 파일로 이동합니다. define 되지 않은 조건부 컴파일에 묶인 코드는 스킵하시면 되죠.