人間50年自作OS30日【1日目】

何度も何度もやろうとして三日坊主だった「30日でできる! OS自作入門」だけど,今回は最後までやってみせるんだから(ここでコネクトが流れる♪)

今回はLinux上でNASM使わずGASでやってみようと思います.正直,探せば同じことしてる人の記事があるんですけど,まぁ勉強のまとめ置き場みたいな感じでよろしくです.
あとAT&TじゃなくてIntel記法で書いていこうと思います.見やすいしね.

1日目

エミュレータQEMU使いました.デバッグとか楽なんで.
バイナリエディタVimでVinariseというプラグインを使いました.
ちなみにLinuxディストリビューションopenSUSEです.ギーコかわいい.

ソースコード

ipl.s

.intel_syntax noprefix

.code16
.byte 0xeb,  0x4e,  0x90
.ascii "HELLOIPL"
.word 512
.byte 1
.word 1
.byte 2
.word 224
.word 2880
.byte 0xf0
.word 9
.word 18
.word 2
.int 0
.int 2880
.byte 0,  0,  0x29
.int 0xffffffff
.ascii "HELLO-OS   "
.ascii "FAT12   "
.skip 18,  0x00

.byte   0xb8,  0x00,  0x00,  0x8e,  0xd0,  0xbc,  0x00,  0x7c
.byte   0x8e,  0xd8,  0x8e,  0xc0,  0xbe,  0x74,  0x7c,  0x8a
.byte   0x04,  0x83,  0xc6,  0x01,  0x3c,  0x00,  0x74,  0x09
.byte   0xb4,  0x0e,  0xbb,  0x0f,  0x00,  0xcd,  0x10,  0xeb
.byte   0xee,  0xf4,  0xeb,  0xfd

.byte 0x0a,  0x0a
.ascii "Hello, world"
.byte 0x0a
.byte 0

.org 0x1fe, 0x00

.byte 0x55,  0xaa

.byte 0xf0,  0xff,  0xff,  0x00,  0x00,  0x00,  0x00,  0x00
.skip 4600,  0x00
.byte 0xf0,  0xff,  0xff,  0x00,  0x00,  0x00,  0x00,  0x00
.skip 1469432, 0x00

1日目は関係無いけど,intel記法で書く時は最初に.intel_syntax noprefixをつける必要がある. GASの場合は以下のようにNASMと書き方が変わる
DB -> .byte
DW -> .word
DD -> .int か .dword
RESB -> .skip

.org 0x1fe, 0x00とすることで次の.byte 0x55, 0xaa以降が0x1feから設置されようになります.0x1fe番地まで0で埋めますよーって感じかな.
そして,文字列を表すときは.ascii
.ascii "HELLO-OS ".ascii "FAT12 "の部分は文字の後ろに3つスペースがあることに気を付けてください.間違えると動きません. "HELLO-OS " 内は自由に変えても良いですが,11byteになるようにしてください.
なんでHello,Worldやるだけなのにこんなゴチャゴチャ書く必要があるんだ?って思いますがFATの仕様なんでこれ→FATファイル システムのしくみと操作法とか見てみるといいかも.

Makefile

IMG=os.img
IPL=ipl.bin

all : ipl.s
        make ipl
        make img
        make run

os.img : $(IPL)
        mformat -f 1440 -C -B $(IPL) -i $(IMG) ::

ipl.bin : ipl.s ipl.ls
        gcc ipl.s -nostdlib -Tipl.ls -o $(IPL)

run : $(IMG)
        qemu-system-i386 -fda $(IMG)
debug    : $(IMG)
        qemu-system-i386 -s -S $(QEMUOPT) $(IMG) -redir tcp:5555:127.0.0.1:1234 &

ipl :
        make ipl.bin
img :
        make os.img
clean:
        rm ipl.bin os.img

リンカスクリプトのipl.lsはOUTPUT_FORMAT("binary")とだけ書いてあります.こうすることでELF形式ではなくバイナリで出力してくれます.
mformantコマンドは他の方*1が使っていたので,真似させて頂きました.
1440kb分のフロッピーイメージファイルをフォーマットして,ブートセクタにipl.binを置いて作成するという意味. このmformatコマンドの情報を調べてオプションの意味はある程度わかったんですが,最後に付けているコロンの意味がよくわからない.
先人の知恵を使う分しっかり詳細を調べねばな…

とりあえず簡単にまとめましたが,加筆するかも.
実はこれ書いてる時点で5日目ぐらいまで進んでいるので,ちょこまかとまとめたいと思います.
日数が進めば進むほど先人の知恵を沢山使わせてもらっています.ありがたい.

5日目以降の記事が無かったら察してください…

1日目のお供のコーナー

OS作成を進めている時や記事を書く時のお供を紹介するコーナー!FOOOO!イェイ!

参考

Cyber Bird OS自作入門 onLinux 1日目

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

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