30日でできる! OS自作入門 ~1日目~ その2
はじめに
下記の続きです.今回は1日目の作業を終わらせたいと思います.
作業
2. 結局何をやったのだろうか
メモ
PCを構成する装置
- 中央処理装置
- 主記憶装置
- 補助記憶装置
- 入力装置
- 出力装置
3. アセンブラ初体験
(30日でできる! OS自作入門 ~1日目~ その1 - m412uのメモ)ではバイナリエディタを使ってhelloos.imgを作成しました.
しかし,今回からはアセンブラを用いて同じファイルを作るみたいです.
ただし,3. アセンブリ初体験
は長すぎるのでアセンブラ記述は飛ばします.
4. もうちょっと書き直してみる
アセンブリコード
;; hello-os ;; TAB=4 ;; FAT12フォーマットフロッピーディスク用の記述 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ; ブートセクタの名前 DW 512 ; 1セクタの大きさ DB 1 ; クラスタの大きさ DW 1 ; FATの開始位置 DB 2 ; FATの個数 DW 224 ; ルートディレクトリ領域の大きさ DW 2880 ; ドライブの大きさ DB 0xf0 ; メディアのタイプ DW 9 ; FAT領域の長さ DW 18 ; 1トラック中のセクタ数 DW 2 ; ヘッドの数 DD 0 ; パーティションを使用していなければ0 DD 2880 ; ドライブの大きさ DB 0, 0, 0x29 ; 固定値? DD 0xffffffff ; ボリュームシリアル番号? DB "HELLO-OS " ; ディスク名 DB "FAT12 " ; フォーマット名 RESB 18 ; 18バイト空ける ;; プログラム本体 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd9, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd ;; メッセージ部分 DB 0x0a, 0x0a DB "Hello, world" DB 0x0a DB 0 RESB 0x1fe-($-$$) DB 0x55, 0xaa ;; ブートセクタ以外 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
サンプルコードと異なる部分が1つあるみたいです.
それは,41行目のRESB 0x1fe-$
がRESB 0x1fe-($-$$)
となっている点です.
アセンブラはnasm
を使います.
nasmのインストール
$ sudo apt install nasm
$ nasm hello-os.s -o hello-os.img hello-os.s:24: warning: uninitialized space declared in .text section: zeroing hello-os.s:41: warning: uninitialized space declared in .text section: zeroing hello-os.s:48: warning: uninitialized space declared in .text section: zeroing hello-os.s:50: warning: uninitialized space declared in .text section: zeroing
実行
$ qemu-system-i386 -fda hello-os.img
その1と同じ画面が出力されました.
もう少し詳しく
- nasmとnaskの違い
http://hrb.osask.jp/wiki/?tools/nask
- FATファイルシステムに関する記事
まとめ
前回挑戦した際は5日目ぐらいまでいけたのでそこまではスムーズに進めそう.