Tsurugidake's diary

プログラミング学習の記録,備忘録

Linuxで書くOS自作入門 1日目

低レイヤの勉強として,「30日でできる!OS自作入門」を購入した.

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

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

せっかくなので本で紹介されているWindowsではなく,Linux(Xubuntu16.04)を使ってOSを書いてみようと思う.

バイナリ写経

イメージファイルのバイナリ写経する.Linuxにはbviとかghexといったバイナリエディタがあるので使ってみたが退屈なので完成物をコピーしてきた. PCエミュレータQEMUは簡単にインストールできた.

sudo apt-get install qemu
qemu-system-i386 helloos.img

f:id:tsurugidake:20170811104117p:plain:w400

ひとまず動作確認.

アセンブラ

先ほどと同じバイナリを生成させるためにアセンブラを用いる.この本では独自のアセンブラNASMが用いられているが,Linuxで使用できる標準的なものを使いたい.
調べてみると,NASKの元となっているNASMの他に,GNUアセンブラGasなどが主流であることが分かった.NASMはIntel構文,GasはAT&T構文といった構文の違いがあるらしい.1
移植の作業量が少ないため,ひとまずはNASMを用いていくことにした.

しばらくは同じバイナリを生成するアセンブリなので,helloos1を飛ばし,helloos2をコンパイルする.

  • 新しいアセンブリ命令
    • DB 指定の1バイト記入 文字列も可 Data Byte
    • DW 指定の2バイト記入 Data Word
    • DD 指定の4バイト記入 Data Double-Word
    • RESB 指定バイト数0で初期化 REServe Bytes

nasmのインストール

sudo apt-get install nasm

アセンブル

nasm helloos.asm helloos.img

実行すると,helloos.asm:41: error: invalid operand typeというエラー.

調べてみると,RESB 0x1fe-($-$$)とすべきようだ.2
nasmでは,$はその行のアドレス,$$はそのセクションの最初のアドレスを指す.($-$$)とすることでセクション内のアドレスを求められるようだが,なぜこれが必要なのか,そもそも0x1feの指すアドレスがどこなのか,1日目の分では分からないのでひとまず読み進めていくことにした.

せっかくなので表示文字列を変えてコンパイル,リンク f:id:tsurugidake:20170812204513p:plain:w400

今度は成功.


余談1

アセンブル時の命令を

nasm helloos.asm helloos.img -l helloos.lst

と付け加えることで,
f:id:tsurugidake:20170812205255p:plain:w400
アセンブリに対するバイナリの対応を見ることができる.そのうち便利になりそう.

余談2

OSはおろか,アセンブリにもブログにも慣れていないため非常に時間がかかってしまった.