OS開発

x86-64(EM64, AMD64)アーキテクチャ向けのOSを開発していく上で集めた情報をまとめます.

Custom Search

開発環境整備

Mac OS Xでの開発環境

コンパイラはgcc(とgas)を使っていきます.開発用のOSは何でも良いのですが,BSDやLinuxでインストールされる(されている)gccなら問題無いかと思います.Mac(OS X)の場合は,標準のgcc(XcodeからCommand Line Toolsとしてインストールするもの)は使えませんので,後ほど説明するように自分でコンパイルします.実験用の仮想環境も何でも良いのですが,私はVirtualBoxを使っています.

Mac OS X標準のgccで開発できない最大の理由は-Ttextという,textセクションの開始アドレスを指定するリンカオプションと--oformat binaryという出力フォーマットをバイナリ形式(ヘッダとかのない実行バイナリ)に変更するリンカオプションが使えないからです.

Mac OS XでOS開発用のgcc/binutilsをインストールする

まず,適当な作業ディレクトリとインストール先を準備します.ここでは,作業ディレクトリとして~/src/インストール先を~/opt/とします.

$ mkdir ~/src ~/opt
$ cd ~/src

次にbinutilsgccをダウンロードします.今回は,binutils-2.22とgcc-core-4.6.4を使っています.まずはそれぞれのアーカイブを展開します.

$ tar -jxvf binutils-2.22.tar.bz2
$ tar -jxvf gcc-core-4.6.4.tar.bz2

それでは,コンパイルしていきます.インストール先を~/opt標準のgccなどと名前が被らないようにそれぞれのプログラムに-osdevというsuffixを付けます.ここでOS X用のgcc/binutilsを作っても標準のgccと同じく目的のリンカオプションが使えないので,FreeBSDをターゲットに設定します.configureは以下のようにしました.gmp, mpfr, libiconv-prefixはMacPortsで入れたので,/opt/localを指定しています.

$ cd binutils-2.22
$ ./configure --prefix=$HOME/opt --program-suffix=-osdev --target=amd64-freebsd9 --enable-stage1-language=c --with-gmp=/opt/local --with-mpfr=/opt/local --with-libiconv-prefix=/opt/local --disable-shared --disable-multilib
$ make
$ make install
$ cd ..

環境によってはコンパイルエラーになることがあるかと思いますが,PATHC_INCLUDE_PATHLIBRARY_PATHあたりを変更しながら進めてください.私はどうしてもMac OS X上で開発したかったので無理矢理整えましたが,諦めてVMにコンパイル環境を整えるのも手です.

binutilsの次にgccのコンパイル・インストールに入ります.

$ cd gcc-4.6.4
$ ./configure --prefix=$HOME/opt --program-suffix=-osdev --target=amd64-freebsd9 --enable-stage1-language=c --with-gmp=/opt/local --with-mpfr=/opt/local --with-libiconv-prefix=/opt/local --disable-shared --disable-multilib --disable-nls --without-headers
$ make all-gcc
$ make install-gcc

これで開発環境は整います.もう一度言いますが,もしエラー多発になったら諦めてVMにコンパイル環境を整えた方が早いと思います.