Building Your First Kernel

OSXDEV

Jump to: navigation, 찾기

여러분이 커널을 작성하기 전에, 커널 소스코드를 가져와야 한다. Mac OS X 커널 소스코드는 http://www.opensource.apple.com 인 Darwin XNU Project 페이지에서 찾을 수 있다. 여러분의 현재 커널 버젼을 확인하기 위해선 터미널에서 uname -a 로 확인하면 된다. 만약 문제가 발생한다면 darwin-kernel 혹은 darwin-development 메일링 리스트 아카이브를 검색해보라. 도움이 되지 않는다면, 메일링 리스트에 질문을 한다. 메일링 리스트에 대한 정보는 http://www.lists.apple.com 에서 찾을 수 있다.


Note: 시작하기 전에, 어떠한 특수 문자도 포함되지 않은 디렉토리에 커널 소스코드의 압축을 풀어 둔다. 커널 소스가 있을 경로에 특수문자가 포함되면 컴파일에 실패할 것이다. 또한 /usr/local/bin 이 PATH 환경 변수에 있어야 한다.

csh 쉘을 사용한다면 set path = (/usr/local/bin$path) 를 .tcshrc 에,

bash 쉘을 사용한다면 export PATH=/usr/local/bin:$PATH 를 .bashrc 에 넣어둔다.

Important: Darwin 커널 컴파일에는 gcc 3.3 이 사용 되도록 한다. Mac OS X 10.4 커널은 gcc 4.0 으로 빌드되지 않을 것이다. 설정하기 위해선 터미널에서 sudo gcc_select 3.3 을 실행한다.

Important: 어떤 것이든 빌드하기 전에, 최신의 개발자 도구와 최신의 Mac OS X 버젼을 사용해야한다. xnu 컴파일 과정 중에 /System/Library/Frameworks 에서 다양한 외부 헤더파일을 참조한다. 이 헤더파일들은 일반적인 Mac OS X 의 설치 과정이 아니라 개발자 도구들 설치시에만 설치된다.


다음으로, 여러분은 컴파일에 필요한 여러 도구를 설치해야 한다. bootstrap_cmds, Libstreams, kext_tools, 그리고 cctools 패치키들을 http://www.opensource.apple.com 으로 부터 가져온다. 이 .tar 패키지들로부터 압축을 풀고 다음을 실행한다:

sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib

cd bootstrap_cmds-version/relpath.tproj

make
sudo make install
cd ../../Libstreams-version
make
sudo make install
cd ../cctools-version

sudo cp /usr/include/ar.h \
       /System/Library/Frameworks/Kernel.framework/Headers


cctools 패키지에서, Makefile 에 COMMON_SUBDIRS 을 다음과 같이 변경한다: COMMON_SUBDIRS = libstuff libmacho misc


마지막으로, 다음 명령어를 실행한다:

make RC_OS=macos
sudo cp misc/seg_hack.NEW /usr/local/bin/seg_hack
cd ld
make RC_OS=macos kld_build
sudo cp static_kld/libkld.a /usr/local/lib
sudo ranlib /usr/local/lib/libkld.a


이제 cctools 프로젝트 관련된 것은 다했다. 마지막 하나 단계가 남아있다: kextsymboltool 의 컴파일. 이를 위해, kext_tools tarball 의 압축을 풀고 다음을 따라한다:

cd kext_tools-version
gcc kextsymboltool.c -o kextsymboltool
sudo cp kextsymboltool /usr/local/bin


WARNING: 만약 여러분의 현재 커널과 같은 버젼의 kextsymboltool 을 사용하지 않는다면, 심각한 컴파일 에러를 보게 될 것이다. 만약 "exported name not in import list" 란 에러 메시지를 본다면 다른 버젼의 kextsymboltool 을 사용 중인 것이다.

축하한다. 여러분은 이제 커널 컴파일에 필요한 모든 도구, 라이브러리, 헤더파일들을 갖추었다.

다음 단계는 커널을 컴파일 하는 것이다. 우선, xnu 디렉토리로 현재 디렉토리를 변경한다. 다음으로, 몇 개의 환경 변수를 설정해야 한다. 여러분의 편의를 위해, 커널 소스는 이를 위한 쉘 스크립트를 포함하고 있다. 만약 sh, bash, zsh, 혹은 다른 Bourne 호환 쉘을 사용중이면 다음 명령어를 따라한다:

source SETUP/setup.sh


만약 csh, tcsh, 혹은 비슷한 쉘을 사용중이면 다음 명령어를 사용한다:

source SETUP/setup.csh


그러면, 다음 명령어를 사용할 수 있을 것이다.

make exporthdrs

make all


이 작업이 끝나면, BUILD/obj/RELEASE_PPC/mach_kernel 에 작동하는 커널을 볼 수 있을 것이다.