30日でできる! OS自作入門 ~1日目~ その2

はじめに

下記の続きです.今回は1日目の作業を終わらせたいと思います.

m412u.hatenablog.com


作業

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

f:id:m412u:20190319222137p:plain
実行画面

その1と同じ画面が出力されました.


もう少し詳しく

  • nasmとnaskの違い

http://hrb.osask.jp/wiki/?tools/nask

FATファイルシステムのしくみと操作法

まとめ

前回挑戦した際は5日目ぐらいまでいけたのでそこまではスムーズに進めそう.


参考

OSの動作原理を勉強する | OS自作入門 1日目 【Linux】 | サラリーマンがハッカーを真剣に目指す

FATファイルシステムのしくみと操作法