step 1 - gasを試す(あきらめてnasmへ・・)
「Q」(エミュレータ)動作確認

 さて、開発環境を決めたところで動作確認です。 まず、本書ではバイナリエディタでブートディスクのディスクイメージを 作成しています。まあ、バイナリエディタの動作は問題ないとして、 エミュレータの動作確認です。

本書で奨励されているバイナリの入力はごめんさせていただくことにして、 付属のCD-ROMに保存されていたディスクイメージをQで読み込んでみたところ、 下の画像の通り問題なく動作しました。




「gas」は使えるか?

 次は懸念のgasです。 本書では、バイナリエディタでディスクイメージを作成した後、 今度はアセンブリ言語で同じ内容を記述しようとしています。 そこで、まずは付属のディスクの「projects/01_day/helloos1/helloos.nas」の内容と 同等のことを行いたいと思います。が、gas は使ったこともなく書式を知らないので、 ひとまず下記の様なCのソースをアセンブリ言語にコンパイルしてみることにしました。

// hellos.c

char mem[] = { 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f };

Terminalで下記の様に打ち、gcc に翻訳してもらいました。

iMac:xx$ gcc -S hellos.c

下記の様なのが「hellos.s」に出力されました。

    .section __TEXT,__text,regular,pure_instructions
    .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
    .machine ppc
    .globl _mem
    .data
    .align 2
_mem:
    .byte   -21
    .byte   78
    .byte   -112
    .byte   72
    .byte   69
    .byte   76
    .byte   76
    .byte   79
    .subsections_via_symbols

この結果を下記の通りに gas にかけてみたところ、

iMac:xx$ as hellos.s

次の様な中身のバイナリファイル「a.out」が出来上がりました。

FE ED FA CE 00 00 00 12 00 00 00 00 00 00 00 01  00 00 00 03 00 00 01 6C 00 00 20 00 00 00 00 01
00 00 01 04 00 00 00 00 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 00 00 00 08 00 00 01 88
00 00 00 08 00 00 00 07 00 00 00 07 00 00 00 03  00 00 00 00 5F 5F 74 65 78 74 00 00 00 00 00 00
00 00 00 00 5F 5F 54 45 58 54 00 00 00 00 00 00  00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 88
00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00  00 00 00 00 00 00 00 00 5F 5F 70 69 63 73 79 6D
62 6F 6C 73 74 75 62 31 5F 5F 54 45 58 54 00 00  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 88 00 00 00 00 00 00 00 00 00 00 00 00  80 00 00 08 00 00 00 00 00 00 00 20 5F 5F 64 61
74 61 00 00 00 00 00 00 00 00 00 00 5F 5F 44 41  54 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 08 00 00 01 88 00 00 00 02 00 00 00 00  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 02 00 00 00 18 00 00 01 90 00 00 00 01  00 00 01 9C 00 00 00 08 00 00 00 0B 00 00 00 50
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01  00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 EB 4E 90 48 45 4C 4C 4F  00 00 00 01 0F 03 00 00 00 00 00 00 00 5F 6D 65
6D 00 00 00

欲しいのは、「eb 4e 90 48 45 4c 4c 4f」のみが入ったファイルでしたが、 ある程度予想していた通り、頭にいろんな情報が付加されています。 おしりにもなんか付いてますね。


鍵はリンカ?

 gas についていろいろと調べてみたところ、どうやらいろんなパーツは、 セクションとやらに分ける必要があるらしく、 ここを見てみると、 コードは「.text」セクションに分けた方がいい様な感じです(これもあたりかどうかは不明)。 また、intel 用のコードをはくためには「-arch i386」という様なオプションもいる様子。 でも、よくよく考えてみたら gas が吐き出しているのは単なるオブジェクトファイルで、 最終的な形にするにはリンカを通す必要がある様な気がしてきました。

で、リンカにかけてみたところ、さらに大きなファイルに変更されました。 たぶんMacで利用可能な様に情報が書き加えられている物と思います。 今回、コードの部分だけを吐き出したいため、リンカについても調査してみたところ、 gcc に付属しているリンカは「ld」というリンカとのこと。 で、例えばここに 書かれている通り出力形式はリンカスクリプトというものを記述して、リンカで制御できる様子です。

ここなどによると、 リンカスクリプトの読み込みオプションは「-T」だとのこと。 と言うことで、リンカスクリプトを適当に書いてみて、下記の通りに通してみようとしたところ、 「そんなフラグは知らん」と怒られてしまいました・・・。

iMac:xx$ ld a.out -T hellos.ls -o hellos.img
ld: unknown flag: -T

バージョンが違うのか?と思い、バージョンを調べてみたところ、 なんだかわからない表記・・・。

iMac:xx$ ld -v
Apple Computer, Inc. version cctools-590.18.obj~10

アップルのページにも「ld」のman(こっちはまだちゃんと読んでませんが・・)にも リンカスクリプトのことについては書いていなさそうです。 Xcodeのgccのバージョンは4.0.xの様なんですが、gcc 4.0.x は以前のバージョンとの互換性に問題がある とか言う情報もあちこちで載っているようで、さらに調べてみたところ、 ここに 「Xcode Toolsに含まれるリンカ(ld) はApple製」との記述が・・・。

GNU製じゃないんですか・・。gcc 4.0.x の互換性以前の問題でした。 もしかして、リンカでMac用以外のコードは出せない様になっているんでしょうか・・。


そして「nasm」

 なんだか、OS作成とは本質的には関係ないところで詰まっていますが、 道具が使えないと物の作成は無理なんで、悩みどころです。 さて、先ほどのページ を良く読んで見たところ、Xcode Tools には「nasm」も含まれているとのこと。 コマンドを打ってみたら、確かに存在する様子です。 確か、本書の「nask」は「nasm」に書式を似せているとの記述もあったと思うので、 試しに「projects/01_day/helloos1/helloos.nas」をコンパイルしてみたところ、 下記の通り、いくつか警告はでたものの何やらファイルが出来上がりました。

iMac:xx$ nasm helloos.nas
helloos.nas:9: warning: uninitialised space declared in .text section: zeroing
helloos.nas:17: warning: uninitialised space declared in .text section: zeroing
helloos.nas:20: warning: uninitialised space declared in .text section: zeroing
helloos.nas:22: warning: uninitialised space declared in .text section: zeroing

中身をバイナリエディタで見てみたところ、何となく目的のものができている様な雰囲気です。 で、「Q」で動作させてみたところ、動きました!


以上、問題が解決している様にも思えず、Cを使い始めるとまた問題が出てきそうで 問題を先送りしているだけの様な気もしますが、とりあえずは gas をあきらめて nasm で進めていこうと思います。


(2006/05/04)

ぐうたラボ...