玩式草子─ソフトウェアとたわむれる日々

第16回 64ビット化への遠い道程[その1]

この記事を読むのに必要な時間:およそ 6.5 分

いつの間にか季節は立冬をすぎ,朝晩はめっきり冷えこむようになってきました。夜の時間も長いし,PCの発熱を気にしなくてすむこの時期は,ソフトウェアとたわむれるのに絶好の時期でしょう。

前回,新しいCore i7なマシンを開発用に自作した話を紹介しました。このCPUにはIntel64と呼ばれる64ビット処理機能が搭載されており,32ビット環境との互換性を持ちつつ,64ビットの処理を実行させることが可能です。そこでさっそくこのCPU上でPlamo Linuxの64ビット化の作業に着手しました。

もっとも,64ビット化のためには,現在の32ビット版のパッケージを64ビット用に再コンパイルしていく必要があります。Plamoは小規模なディストリビューションとは言え,収録しているパッケージは1000を越えているので,それら全てを64ビット用に再コンパイルするのはかなり時間と根気のいる作業です。64ビット版Plamo Linuxを一般に公開できるようになるのはだいぶ先の話になりそうですが,この連載では適宜進行状況を紹介していきたいと思います。今回はその第1回目として,64ビット用の開発環境を構築した話題を取り上げてみましょう。

x86-64 CPU

今回導入したCore i7もそうですが,最近のIntel/AMD製のCPUではたいていx86-64と呼ばれる64ビット化機能が組み込まれています。この機能はIntel CPUではIntel64AMD CPUではAMD64と呼んでいますが,機能的には同一なので,両者を総称してx86-64と呼ぶことにします。

歴史的に見ると,Intelは伝統的なx86アーキテクチャと互換性のない新しい64ビットCPU(Itanium)を開発し,AMDなどのx86互換32ビットCPUを作っているメーカを振り切る戦略を取りました。一方,AMDはx86用に開発されてきた膨大なソフトウェアをそのまま活用できるように,32ビットと互換性を持つような64ビットCPU(AMD64)を開発しました。AMDのこの動きに対して,当初はIntelも32ビットと互換性を持った64ビットCPUを独自の設計で開発しようとしていましたが,32ビットと互換性を持ちながら機能が少しづつ異なる2種の64ビットCPUが生まれてしまうとソフトウェアの開発が大変になります。そう危惧したMicrosoftの圧力もあって,IntelはAMD64と互換の設計を採用し,当初はその機能をEM64T(Extended Memory 64bit Technology)⁠ 後にIntel64と改名しました。

表1が,x86-64 CPUのもつ動作モードです。x86-64 CPUには,x86系CPUが持っていた従来からの3つの動作モードに加えて,64ビットモード互換モードという2つのモードが追加されています。この追加された2つのモードはロングモードと総称され,それに合わせて従来からある3つの動作モードはレガシーモードと呼称されます。x86-64 CPUは,明示的にロングモードに移行しない限り,従来通りのレガシーモードで動作し,x86系CPUと互換で,32ビットバイナリだけでなく,BIOS等が利用する16ビットのリアルモードもそのまま動作します。

表1 x86-64 CPUの動作モード

動作モード必要なOSアプリ側の対応
ロングモード64ビットモード64ビット用OS(x86-64用カーネル)64ビット化が必要
互換モード32ビットのまま動作可能
レガシーモードプロテクトモード32ビット用OS(x86用カーネル)32ビット用
仮想8086モード16ビット用
リアルモード16ビット用OS(MS-DOS等)

一方,ロングモードに入るとアドレス長が64ビットに拡張され,新たに追加された64ビットの汎用レジスタも使えるようになります。また,ロングモードの中には32ビットのバイナリを動かす互換モードも用意され,このモードを使えば既存の32ビットのバイナリもそのまま動かすことができるようになっています。

こう書けばいいことづくめのように聞こえますが,そもそもロングモードに入るためにはカーネル自体がx86-64用にコンパイルされて,x86-64のロングモードのことを知っていなければいけませんし,カーネルをx86-64用にコンパイルするためには,コンパイラやアセンブラがx86-64用に拡張されたコマンド(オペコード)を生成できる必要があります。すなわちx86-64 CPUの新機能を利用するには,まずx86-64用の開発環境を用意する必要があるわけです。

x86-64用開発環境の選択

x86-64用の開発環境を作るにはいくつかの方法があります。一番簡単なのは既存のx86-64用のLinuxディストリビューションを導入することですが,それではあまり面白くないので,今回はx86環境上でx86-64用のバイナリを生成するクロスコンパイルの方法で開発環境を作りあげることにしました。

クロスコンパイルの場合,まず64ビット用のバイナリを生成できるコンパイラとアセンブラを32ビット環境上に用意し(クロスコンパイラ)⁠そのコンパイラを使って64ビットネイティブな開発環境を作る,という流れになります。

この作業ではソフトウェアを構築していく順序が重要になるので,その手順について詳しく紹介している,CLFSプロジェクトのドキュメントを利用して作業することにしました。

CLFS(Cross Linux From Scratch)は, Linux環境を全て手動でコンパイルして作りあげる方法を紹介しているLFSプロジェクトの一部で, "Cross" の名前通り,x86環境上でMIPS用やPPC用のLinux環境をビルドする手順を詳細に紹介してくれています。

CLFSのx86-64用環境には,Pure64と呼ばれる64ビット専用の環境とmultilibと呼ばれる32ビット/64ビット兼用の環境がありますが,今回は,既存の32ビットバイナリもそのまま動かせるmultilib環境を構築することにしました。

CLFSのPure64環境とmultilib環境ではライブラリの配置等が異なり,Pure64環境では/libや/usr/libに64ビット用のライブラリを置き,32ビット用のライブラリは/lib32や/usr/lib32というディレクトリに置きます。この場合,64ビット用のバイナリはデフォルトのままビルドできますが,32ビット用のバイナリは/lib32や/usr/lib32を見に行くように設定してビルドする必要があり,既存の32ビット用のバイナリは作り直さなければなりません。

一方,multilib環境の場合,32ビット用のライブラリは従来通り/libや/usr/libに配置し,新しい64ビット用のライブラリを /lib64 や /usr/lib64 というディレクトリに置くようになっています。この場合,32ビット用のバイナリは再ビルドしなくても使えますが,新しく64ビット用のバイナリを作る際には,参照するライブラリを/lib64や/usr/lib64に指定する設定が必要になります。

32ビット用の資産を使わずに64ビット用Linuxを作りあげる場合はPure64の設定の方が合理的ですが,Plamoの場合,32ビット用のパッケージがそれなりに充実しているので,それらはそのまま流用できた方が便利です。そこでmultilibの方法で64ビット環境をビルドすることにしました。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入