Tsurugidake's diary

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

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

「30日でできる!OS自作入門」を購入した.

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

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

このブログでは、Linux(Ubuntu16.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では,$はその行のアドレス,$$はそのセクションの最初のアドレスを指すらしい.

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

今度は成功.


余談

アセンブル時の命令を

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

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