Jul 27, 2008

自宅サーバのカーネル64bit化

CLFSのドキュメントを参考にクロスコンパイル環境を構築し、カーネルのみ64bit化した。
環境は以下の通り。
  • ベースのOS環境はLFS(SVN-20070304版)
  • linux-2.6.26
  • binutils-2.17
  • gcc-4.1.2
※なぜか、--prefixで/usr/local/crossを指定しているのに、/usr/local/cross/usr/local/crossにインストールされてしまうので、都度移動させた。H8用のクロスコンパイル環境を作った時はそんなこと無かったのに。
準備
export DESTDIR=/usr/local/cross
unset CFLAGS
unset CXXFLAGS
PATH=${DESTDIR}/bin:/bin:/usr/bin
export PATH
export XTARGET="x86_64-unknown-linux-gnu"
export BUILD64="-m64"
cd /sources
mkdir build64
cd build64
bin-utils-2.17
bzip2 -dc ../binutils-2.17.tar.bz2 | tar xf -
mkdir binutils-build
cd binutils-build
../binutils-2.17/configure --prefix=${DESTDIR} \
--host=${MACHTYPE} --target=${XTARGET} \
--disable-nls --enable-shared --enable-64-bit-bfd --disable-multilib
make configure-host
make
make install
cd ..
gcc-4.1.2
bzip2 -dc ../gcc-4.1.2.tar.bz2 | tar xf -
mkdir gcc-build
cd gcc-build
../gcc-4.1.2/configure --prefix=${DESTDIR} \
--host=${MACHTYPE} --target=${XTARGET} --disable-multilib \
--disable-nls --disable-shared \
--disable-threads --enable-languages=c
make all-gcc
make install-gcc
cd ..
カーネル
bzip2 -dc ../linux-2.6.26.tar.bz2 | tar xf -
cd linux-2.6.26
export CC="${XTARGET}-gcc"
export CXX="${XTARGET}-g++"
export AR="${XTARGET}-ar"
export AS="${XTARGET}-as"
export RANLIB="${XTARGET}-ranlib"
export LD="${XTARGET}-ld"
export STRIP="${XTARGET}-strip"

make ARCH=x86_64 CROSS_COMPILE=${XTARGET}- menuconfig
make ARCH=x86_64 CROSS_COMPILE=${XTARGET}-

※ユーザランドのプログラムは全部32bitアプリなので、32bit互換モードオプションを忘れずに。
Executable file formats / Emulations --->
 IA32 Emulation

freeを実行してみると、リニアに4GBのメモリが使えることを確認できた。めでたしめでたし。
# free
             total       used       free     shared    buffers     cached
Mem:       3972264     112452    3859812          0       4072      47540
-/+ buffers/cache:      60840    3911424
Swap:      1004052          0    1004052
Posted at 15:59 in computer