2005年12月11日(日) [過去の今日]
#2 64bit kernel with 32bit userland
せっかくAthlon64を買ったのに32bitのままで使い続けるのももったいない、というか、違いを確認するための64bitバイナリ実行環境が欲しいというのもあって、いろいろ試行錯誤してみた。
debianのi386 portにも実はlib64*とかlibc6-amd64とかがあって、userland的には64bitバイナリが実行可能だったりする。あとはカーネルが64bit化されれば、64bitバイナリを実行できるはず。
ということでIRCでその筋のエロい人に教えてもらったり、ウェブを検索したりして実際にやってみた。
まずは
# apt-get install libc6-amd64 libc6-dev-amd64 lib64*
で、64bitライブラリを揃える。
それから64bitカーネルをコンパイルするために、クロスコンパイル環境を作る。これがいろいろと曲者だった。
$ apt-get source binutils gcc-3.4
してソースをゲットしたはいいが、これを手makeしなきゃならない。 まずはbinutilsから、gcc-3.4を使ってmakeする
$ CC=gcc-3.4 ./configure --prefix=/usr/local/cross_x86-64 \ --target=x86_64-linux --host=i686-linux --build=i686-linux $ CC=gcc-3.4 make $ make install
そしたら次にgcc-3.4をコンパイルするのだが、これがちょっとめんどう。
# cp -a /usr/include /usr/local/cross_x86-64 # cp -a /usr/src/linux/include/linux /usr/local/cross_x86-64/include/linux # cp -a /usr/src/linux/include/asm-generic /usr/local/cross_x86-64/include/linux/ # cp -a /usr/src/linux/include/asm-x86_64 /usr/local/cross_x86-64/include/linux/asm # cp -a /lib64/* /usr/local/cross_x86-64/lib/ # cp -a /usr/lib64/* /usr/local/cross_x86-64/lib/
と、このようにライブラリをまとめて置いといてやらないといけないみたい。
さて、そしてgcc-3.4のコンパイル
$ CC=gcc-3.4 PATH=$PATH:/usr/local/cross_x86-64/bin ./configure \ --prefix=/usr/local/cross_x86-64 \ --target=x86_64-linux --host=i686-linux --build=i686-linux\ --enable-languages=c --with-gnu-as --with-gnu-ld --disable-shared $ CC=gcc-3.4 PATH=$PATH:/usr/local/cross_x86-64/bin make # make install
ふう、これで準備完了。いよいよカーネルの構築。
$ make HOSTCC="gcc-3.4" ARCH=x86_64 \ CROSS_COMPILE=/usr/local/cross_x86-64/bin/x86_64-linux- oldconfig $ make HOSTCC="gcc-3.4" ARCH=x86_64 \ CROSS_COMPILE=/usr/local/cross_x86-64/bin/x86_64-linux- menuconfig $ make HOSTCC="gcc-3.4" ARCH=x86_64 \ CROSS_COMPILE=/usr/local/cross_x86-64/bin/x86_64-linux- vmlinux $ make HOSTCC="gcc-3.4" ARCH=x86_64 \ CROSS_COMPILE=/usr/local/cross_x86-64/bin/x86_64-linux- install $ make HOSTCC="gcc-3.4" ARCH=x86_64 \ CROSS_COMPILE=/usr/local/cross_x86-64/bin/x86_64-linux- modules $ make HOSTCC="gcc-3.4" ARCH=x86_64 \ CROSS_COMPILE=/usr/local/cross_x86-64/bin/x86_64-linux- modules_install
カーネルの設定でIA32 Emulationは必ず入れておくこと。考えたらmake-kpkgを使わずlinuxカーネルを作ったのってはじめてだな。こんなんでいいんだっけ?(わら
ま、とりあえずこれで再起動。すると32bitのmodprobeなんかもちゃんと動いて、モジュールもきちんと組み込まれる。適当なCのソースをcc -m64でコンパイルしても、ちゃんと動く。
よしよし、とりあえずこれで64bitバイナリ実行環境は整ったぞっと。あとはベンチマークに適したソフトを見っけて来るかなあ。
(@707)
@ む?:
一通りのデバイスが問題なく動いてるので気にならなかったが、チューナカード(saa7130)が動いてなかったようだ。
dmesgをみると、
ioctl32(tvtime:19971): Unknown cmd fd(6) cmd(80685600){00} arg(ffffb288) on /dev/video0 ioctl32(mplayer:19988): Unknown cmd fd(4) cmd(80685600){00} arg(083e98fc) on /dev/video0 ioctl32(mplayer:19998): Unknown cmd fd(4) cmd(80685600){00} arg(083e98fc) on /dev/video0 ioctl32(mplayer:20008): Unknown cmd fd(4) cmd(80685600){00} arg(083e98fc) on /dev/video0 ioctl32(v4l-conf:20011): Unknown cmd fd(4) cmd(80685600){00} arg(ffffb67c) on /dev/video0 ioctl32(xawtv:27124): Unknown cmd fd(4) cmd(80685600){00} arg(080c5188) on /dev/video0 ioctl32(v4lctl:27126): Unknown cmd fd(4) cmd(80585600){00} arg(0806a458) on /dev/video0 ioctl32(v4lctl:27126): Unknown cmd fd(4) cmd(80685600){00} arg(0806a458) on /dev/video0
むう、このへんはPure64じゃないと動かないぜって事なのかな?
(@779)