故 Dennis Ritchie와 Ken Thompson이 약 40년전에 PDP-11에서 C언어와 UNIX를 만들었다. PDP-11용 UNIX는 version 6의 코드가 남아있는데, Go언어 개발 등에 참여하고 있는 Russ Cox를 비롯한 옛날 벨연구소의 Plan9 프로젝트 일당이 MIT에서 운영체제 수업을 위해서 UNIX version 6 를 x86으로 포팅한 것이 Xv6라는 프로젝트이다.
간단히 말하면 x86용 운영체제 커널이고, 약 8천라인의 매우 짧은, 학습용의 운영체제 커널이다. 하지만, 다른 학습용 커널과 달리, 이것은 최초의 UNIX를 re-implementation한 거이라는 데에 의의가 있다. 아무튼, Xv6는 Linux에서는 매우 쉽게 빌드(make만 하면 된다)가 되고, Windows에서는 Cygwin을 끼얹으면 매우 불편하지만 대충 빌드가 되는 모양인데, Mac OS X의 gcc는 기본적으로 ELF 포맷이 아니기 때문에 약간의 빌드환경을 위한 크로스컴파일을 위한 gcc 자체를 빌드하는 과정이 필요하다.
웹사이트에는 이렇게저렇게 20줄 정도만 입력하면 빌드환경을 구축할 수 있다고 하는데, 직접 해보니 잘 안되었다. 수정한 빌드 과정을 여기에 기록한다. 아래처럼 하면 빌드할 수 있다. wget과 Homebrew가 설치되어 있다고 가정한다. wget이 없다면 brew install wget 으로 설치한다. Homebrew의 설치는 이쪽을 참조한다.
1. 일단, gawk, gmp, mpfr, mpc, glib 가 필요하다. gawk, gmp와 mpfr은 brew로 설치하면 되는데, mpc는 brew로 설치하면 동명이인의 다른 패키지이다. brew는 설치되었다고 가정한다. MacPort를 사용하더라도 큰 차이는 없으리라 생각된다.
brew install gawk gmp mpfr glib
혹시, glib의 소스 다운로드가 매우 오래걸리고 진행이 안된다면, brew edit glib 를 실행해서, ftp:// 부분을 http:// 로 바꿔보면, 매우 빠르게 다운로드가 될 것이다.
2. mpc를 수동으로 설치한다. 컴파일 에러가 나는 부분을 sed -ie로 수정한다.
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
tar xvfz mpc-0.8.1.tar.gz
cd mpc-0.8.1
sed -ie 's/GMP_RNDA/MPFR_RNDA/g' src/acos.c
./configure --prefix=/usr/local/mpc-0.8.1
make
sudo make install
3. binutils, gcc-4.5.1, gdb-6.8a의 소스를 받아서 빌드 한다.
wget http://ftpmirror.gnu.org/binutils/binutils-2.21.1.tar.bz2
wget http://ftpmirror.gnu.org/gcc/gcc-4.5.1/gcc-core-4.5.1.tar.bz2
wget http://ftpmirror.gnu.org/gdb/gdb-6.8a.tar.gz
tar xvfz binutils-2.21.1.tar.bz2
tar xvfz gcc-core-4.5.1.tar.bz2
tar xvfz gdb-6.8a.tar.gz
cd binutils-2.21.1
./configure --target=i386-jos-elf --disable-nls
make
sudo make install
cd ../gcc-4.5.1
mkdir build
cd build
../configure --target=i386-jos-elf --disable-nls --without-headers \
--with-newlib --disable-threads --disable-shared \
--disable-libmudflap --disable-libssp \
--with-mpc=/usr/local/mpc-0.8.1
make
sudo make install
cd ../gdb-6.8
./configure --target=i386-jos-elf --program-prefix=i386-jos-elf- \
--disable-werror
make
sudo make install
cd ..
참고로, Linux는 여기까지의 과정이 필요없다. -_-
4. 패치된 qemu를 설치한다. qemu를 이미 다른 곳에서 쓰는 경우는, configure 할때 --prefix 로 프리픽스를 건다.
git clone http://pdos.csail.mit.edu/6.828/qemu.git -b 6.828-0.15
cd qemu
./configure --disable-kvm --disable-sdl --target-list="i386-softmmu x86_64-softmmu"
make
sudo make install
5. Xv6 의 소스를 받아서 빌드하고, 실행한다. 지금도 개발중일 수 있는데, xv6-rev6 버전으로 빌드하겠다. 리눅스는 make 할때 TOOLPREFIX 옵션이 필요 없다.
git clone git://pdos.csail.mit.edu/xv6/xv6.git
cd xv6
git checkout -b xv6-rev6 xv6-rev6
make TOOLPREFIX=i386-jos-elf-
make qemu
qemu를 통해서, 빌드한 Xv6의 이미지가 부팅된 것을 볼 수 있다. 즐거운 커널 해킹 되시길!
-- 이상한 나라의 종텐.
Trackback URL : http://jong10.com/trackback/506