はりぼてOSでC++言語を使いたい

Bayside2006-05-18


30日でできる! OS自作入門

30日でできる! OS自作入門

はりぼてOS は、アセンブラに比べれば見通しのよいC言語で書かれています。しかし、普段からオブジェクト指向バリバリの人にはC言語ですら可読性が低く、C++言語で書けたらどんなにいいだろうと思っていました。試行錯誤の結果、うまくいったので、その紹介です。

必要なファイル

http://sourceforge.net/project/showfiles.php?group_id=2435 から「MinGW 5.0.2」をダウンロードします。

インストール

  • ダウンロードしたファイルを実行して「Download only」を選択します
  • MinGW base tools」と「g++ compiler」を選択します
  • binutils-2.15.91-20040904-1.tar.gz」と「gcc-g++-3.4.2-20040916-1.tar.gz」を解凍します
  • bin/as.exe, bin/c++.exe, libexec/gcc/mingw32/3.4.2/cc1plus.exe を「tolset」の「z_tools」にコピーします

Makefileの設定

以下の設定を追加します。例は harib00j の例です。長ったらしいオプションは、Mona から伝授された OS を作るときのおまじないです。

CPP = $(TOOLPATH)c++.exe -I$(INCPATH) -Os -Wall -nostdlib -fno-builtin -fno-exceptions -fno-rtti -B$(TOOLPATH) -c

#bootpack.gas : bootpack.c Makefile
#	$(CC1) -o bootpack.gas bootpack.c

#bootpack.nas : bootpack.gas Makefile
#	$(GAS2NASK) bootpack.gas bootpack.nas

#bootpack.obj : bootpack.nas Makefile
#	$(NASK) bootpack.nas bootpack.obj bootpack.lst

bootpack.obj : bootpack.cpp Makefile
	$(CPP) -o bootpack.obj bootpack.cpp

ものぐさな人のために

C++対応版のtolsetを こちら から取得できます。

bootpack.cpp

ポイントは以下のとおりです。

  • C言語の関数には extern "C" をつける
  • new, delete 等の関数が未定義参照になるので実装する
  • 一番初めに呼ばれる関数はC言語で書く
/* C言語の関数宣言 */
extern "C" {
void io_hlt(void);
void HariMain(void);
};

/* C++言語の関数宣言 */
void CppMain(void);

/* C言語の入り口 */
void HariMain(void)
{
	CppMain();
}

/* とりあえずごまかす */
void* operator new(unsigned int size) { return (void *)0; }
void  operator delete(void* address) {}
void* operator new[](unsigned int size) { return (void *)0; }
void  operator delete[](void* address) {}

/* テストクラス */
class Test {
public:
	/* コンストラクタ */
	Test() {
		for (int i = 0xa0000; i <= 0xaffff; i++) {
			char *p = (char *)i; /* 番地を代入 */
			*p = i & 0x0f;
		}
	}
	
	virtual ~Test() {
	}
};

/* C++言語の入り口 */
void CppMain(void)
{
	Test test;

	for (;;) {
		io_hlt();
	}
}