__fastcallへの対処

じつは、カーネル内の一部の関数には__fastcallというキーワードが設定されている。このコードは関数の呼び出し規約を設定するもので、関数を呼び出すときなるべくスタックを介さずにレジスタを介してパラメタを引き渡そうとするものである。

これをgccで実現するためには、独自拡張機能である__attribute__を用いる。これはgccの起動オプションにマクロとしてこの変換を行うように実装すればよい。そこで、またまたconfigureスクリプトを一部修正する。

CFLAGS= (中略)-D"__fastcall=__attribute__((fastcall))"

こんな感じでカーネルの部分はコンパイルできる・・・はず。

外部シンボルの違いへの対応

Linuxgccコンパイルするとグローバルな関数名や変数名はそのまま外部シンボルになるが、Windowsではこの関数名や変数名の前にアンダースコア'_'がついて外部シンボルとなる。また、アセンブリコードではどちらの環境でも外部シンボルの値は同じになる。つまり、Cのソースからアセンブリのサブルーチンを呼び出すとき、アセンブリのソースからCの関数を呼び出すときはシンボル名の違いに気を付けて名前を指定する必要がある。

しかし、この名前の設定も環境が変わるとうまくいかなくなる。そこで、現状のMONAソースコードでは環境に応じてアセンブリの外部シンボルを変更させるためのマクロを用意している。つまり、Windowsで実行するときは自動的に外部シンボルにアンダースコアをつけ、そうでないときにはそのままの名前を外部シンボルとして設定するようにしている。この設定の切り替えはアセンブラにBUILD_ON_LINUXというマクロを設定するかいなかで切り替えられるようになっている。

が、そんなことをせずともgccには便利なオプションがついている。gcc実行時に-fleading-underscoreというオプションを付ければ勝手に外部シンボルにアンダースコアを付けてくれる。以下、この方法を採用してMONAをビルドすることにする。

gccにオプションを設定させるために、configureスクリプトを一部修正する。configureスクリプトの下の方にいくとMakefile.incの内容を設定している部分がある。この部分のCFLAGSという変数がgccのオプションとなる部分である。この部分をちょっと変更させる。

CFLAGS= (中略)-fleading-underscore

これでなんとかカーネルの部分がコンパイル・・・できないorz

configureの対応

Linux上でMONAをビルドしようとすると、まずこの問題に取りかからなければならない。現状のconfigureスクリプトMinGWをインストールしていないLinuxでの使用を想定していないのである。そのまま実行すると次のようなエラーメッセージが出てきてしまう。

[taka@tkralia mona]$ ./configure
Host type... Unknown OS type.

このままでは先に進まないので、configureスクリプトのHOST OSをチェックしている部分を一部変更することにする。

case $OSTYPE in
cygwin)
  HOST=CYGWIN
  ;;
linux)
  HOST=LINUX
  ;;
*)
  echo 'Unknown OS type'
  exit 1
  ;;
esac

これでひとまず、configureスクリプトが動作するようになる。

あらまし

この日記ではMONALinux上でビルドする方法についてまとめてある。いちおう、MinGWを用いればLinux上でもMONAがビルドできるが、ここではMinGWを用いずにMONAコンパイルする方法について述べる。ただし、現時点ではMONAのビルドは成功していない。まあ、DLLだとかEXEという文字をMakefileで見つけているので嫌な予感はしているのですが。

訪問者5000人突破

[MONA] 久々の更新
とりあえず、リハビリがてら短いのを作成。
内容はMONA-0.3.0でのブートシーケンスに関すること。
実はMONA解析ページのトップページには作者しか知らない
ページがいくつか隠されていたりする。
5000人突破記念にブートネタでひとつ紹介する。
http://tkralia.hp.infoseek.co.jp/mona/BPB.txt
こいつはBIOSブートパラメタブロックというやつで、firstboot.asmの
先頭で定義してある変な変数の一覧だ。