『30日でできる!OS自作入門』を macOS 10.15 Catalinaで実行してみました。
→ソースコードは GitHubにあげています。
https://github.com/noanoa07/myHariboteOS
(※ 2020.10.14追記:
A.6. Cコンパイラ i386-elf-gcc
のインストール方法を更新
→ コメント参照 thanx @Ken2mer !)
A. 環境構築
著者作成の独自ツール(tolsetフォルダ内のツール)は、Windows用であり macOS Catalinaでは動作させることが困難なため、Linux用ツールを使用することにする。
(Catalinaでは、32bitアプリが動作しなくなったため、従来の macOS向けのブログ記事では動かなくなったものが多い。)
1. バイナリエディタ HEX FIEND
AppStore版 もある。
好みのものでいいが、0xED は不安定だった。
「Chapter 1-1:とにかくやるのだぁ(helloos0)」では、
バイナリエディタ Bz の代わりに使う。
2. アセンブラ NASM
「Chapter 1-3:アセンブラ初体験(helloos1)」では、
著者作成のアセンブラ naskの代わりに NASMを使う。
# Homebrewでインストール
% brew install nasm
# バージョンを確認 (現時点でバージョンは 2.14.02)
% nasm -v
# NASMで helloos.nasをコンパイルして、helloos.imgを作る
% nasm helloos.nas -o helloos.img
※著者作成の nask と NASM の違い
nask | NASM |
---|---|
RESB 18 | TIMES 18 DB 0 |
RESB 0x7dfe-$ | TIMES 0x1fe-($-$$) DB 0 |
ALIGNB 16 | ALIGN 16, DB 0 |
[FORMAT "WCOFF"] | この行削除 |
[INSTRSET "i486p"] | この行削除 |
[FILE "naskfunc.nas"] | この行削除 |
[FORMAT "WCOFF"] | この行削除 |
JMP entry(修正の必要なし?) | JMP SHORT entry |
_io_hlt( _ の付くもの) | io_hlt( _ を削除) |
3. エミュレータ QEMU
macOS用の QEMUを使う。
# Homebrewでインストール
% brew install qemu
# バージョンを確認 (バージョン 4.1.1 以上でないと表示に不具合)
% qemu-system-i386 -version
# イメージファイル helloos.imgを QEMUで実行(なるべく警告の出ないコマンドラインオプション)
% qemu-system-i386 -drive file=helloos.img,format=raw,if=floppy -boot a
# マウスが消えてしまった時は、control + option + g でマウスをリリース
4. エディタ
「Chapter 2-1:まずはテキストエディタの紹介」では、
TeraPadの代わりに、macOS用の好みのテキストエディタを使う。
5. Mtools
「Chapter 2-3:ブートセレクタだけを作るように整理(helloos4)」では、
著者作成の edimg.exeの代わりに、ディスクイメージの作成に Mtoolsの mformat を使う。
# Homebrewでインストール
% brew install mtools
# バージョンを確認 (現時点でバージョンは 4.0.23)
% mtools --version
#ディスクイメージ helloos.imgを作る
% mformat -f 1440 -C -B ipl.bin -i helloos.img ::
さらに、「Chapter 3-5:OS本体を書き始めてみる(harib00e)」では、
ディスクイメージの作成に Mtoolsの mformat と mcopyを使う。
# ディスクイメージ haribote.imgを作る
% mformat -f 1440 -C -B ipl.bin -i haribote.img ::
% mcopy -i haribote.img haribote.sys ::
6. Cコンパイラ i386-elf-gcc
「Chapter 3-9:ついにC言語導入へ(harib00i)」では、
著者作成のCコンパイラ cc1.exe等の代わりに、i386-elf-gccを使う。
その際、6. のリンカスクリプトを併せることでコンパイルする。
(macOS標準の gccは、実は clangなので、リンカオプション -T が使えない)
(※2020.10.14 追記;
@Ken2mer さんのコメントより、
Homebrew公式では、64bit版のx86_64-elf-gcc
がインストールされてしまうようになったので、tap nativeos/i386-elf-toolchain
からインストールする。)
# Homebrewでtapしてインストール
% brew tap nativeos/i386-elf-toolchain
% brew install i386-elf-binutils i386-elf-gcc
#バージョンの確認(現時点でバージョンは 9.2.0)
% i386-elf-gcc -v
7. リンカスクリプト
「Chapter 3-9:ついにC言語導入へ(harib00i)」では、
のページの「OS用リンカスクリプト」を使わせて頂いた。これを hrb.ldとして作成して、これを用いてコンパイルする。
# bootpack.cを、リンクスクリプト hrb.ldを利用してコンパイルし、bootpack.hrbを作る
% i386-elf-gcc -march=i486 -m32 -nostdlib -T hrb.ld bootpack.c -o bootpack.hrb
8. フォントファイル hankaku.txtを変換するためのプログラム
「Chapter 5-5:フォントを増やしたい(harib02e)」では、
著者作成の makefont.exeの代わりに、
「GDT(グローバルディスクリプタテーブル) - OS自作入門 5日目-1 【Linux】 - サラリーマンがハッカーを真剣に目指す」
のページの「フォントファイルのリンクについて」を使わせて頂いた。これを convHankakuTxt.cとして作成し、これを用いて hankaku.txtを変換する。
# convHankakuTxt.cは標準ライブラリが必要なので、macOS標準のgccを使う
% gcc convHankakuTxt.c -o convHankakuTxt
% ./convHankakuTxt
# 出来た hankaku.cファイルを他のファイルとリンクする
% i386-elf-gcc -march=i486 -m32 -nostdlib -T hrb.ld -g bootpack.c hankaku.c naskfunc.o -o bootpack.hrb
9. sprintf関数
「Chapter 5-7:変数の値の表示(harib02g)」では、
著者作成の GOコンパイラ付属の stdio の sprintfの代わりに、
「sprintfを実装する - OS自作入門 5日目-2 【Linux】 - サラリーマンがハッカーを真剣に目指す」
のページの sprintf関数を使わせて頂いた。これを mysprintf.cとして作成する。
なお、コンパイル時に警告が出たので;
second parameter of 'va_start' not last named argument
mysprintf.cを少し修正した。
//va_start (list, 2);
va_start (list, fmt);
独自の sprintf関数を使うので、bootpack.cも修正する。
//#include <stdio.h> // mysprintf.cを独自に作成したので、この行削除
Makefileも mysprintf.c に合わせる。
# 独自の mysprintf.cの sprintf関数ではコンパイル時に警告が出るので、-fno-builtinオプションを追加
% i386-elf-gcc -march=i486 -m32 -nostdlib -fno-builtin -T hrb.ld -g bootpack.c hankaku.c naskfunc.o mysprintf.c -o bootpack.hrb
※ 註)
この sprintfは ”%d” と ”%x” にしか対応させていません。
とのことなので、"%02X" は "%x" に、"%3d" は "%d" に書き換える必要がある。
B. 実行方法
1. このレポジトリを clone
% git clone git@github.com:noanoa07/myHariboteOS.git
※うまくいかない時は、右上の「Clone or download」ボタンで
「Download ZIP」でダウンロードして、ZIPファイルを解凍する
のでも OK。
2. 確認
% cd HariboteOS/01_day/helloos0
% make run
3. 実行コマンド
# コンパイルして、実行
% make run
# イメージファイル haribote.img を作成
% make img
# デフォルトは make img
% make
# コンパイルしてできたファイルの内、haribote.img以外を削除
% make clean
# ソースファイル以外(haribote.imgも含め)をすべて削除
% make src_only
# ipl.nasをコンパイル (03_day/harib00dまで)
% make asm
※ 註)
フロッピーディスクに書き込む機能、コマンド(make install
)は省いた。
C. 書籍のソースコード
マイナビ出版のサポートサイト より、HariboteOS.zip がダウンロードできる。
※註)
Windows用の エンコーディング/改行コード(ShiftJIS/CRLF)なので、macOSや Linux用の UTF8/LFに変換した方が良い。エディタで変換するか、変換ツールがとしては nkfがある。
# Homebrewでインストール
% brew install nkf
# バージョンを確認 (現時点でバージョンは 2.1.5)
% nkf -v
# 例) .cファイルをUTF8/LFに変換
% nkf -wLu --overwrite *.c
参考
- 正誤表
- サポートページ
- Wiki 一覧 - os-wiki
- Wiki 目次 - hrb-wiki
- OSを作るときによく使うBIOSファンクション (AT互換機) - os-wiki
- AT互換機でのメモリマップ - os-wiki
- naskについてのページ - hrb-wiki
- VGA - ビデオDAコンバータ - os-wiki
- (PIC)8259A - os-wiki
- (AT)keyboard - os-wiki
- 『30日でできる!OS自作入門』のメモ
- 30日でできる!OS自作入門(記事一覧)[Ubuntu16.04/NASM] - pollenjp - Qiita
- 30日でできる!OS自作入門 まとめ - サラリーマンがハッカーを真剣に目指す
- 『30日でできる! OS自作入門』 for macOS - tatsumack -Qiita
- 『30日でできる! OS自作入門』 for macOS - sandai/30nichideosjisaku -GitHub
- 始める前に 30日でできる!OS自作入門 - ねこめもmkII(マークツー)
- OS自作入門1日目 - duloxetine - Qiita
- 『30日でできる!OS自作入門』をLinuxでやってみる 1日目 - Akitsushima Design
- Linuxで書くOS自作入門 1日目 - Tsurugidake's diary
- このリポジトリは「30日でできる!自作OS入門」の実践リポジトリです - Bo0km4n/os-practice - GitHub
- 30日でできる! OS自作入門 - yishibashi/hariboteOS - GitHub
- 『OS自作入門』を読んでみた。(その6) - いものやま。
- 自作OS入門の環境をOS Xで整える - SWEet
- macOSでi386-elf向けのGCCをインストールする - tatsumack - Qiita
- 8日目(マウスを動かすまで) - ねこめもmkII(マークツー)
※註)
macOSとはいえ、ほとんどLinuxと環境なので、検索キーワードに Linux
を入れるとヒットすることがある。
ただし、macOS の gccは、実態は clangなので、そこで苦労したりする。
謝意
・ 「リンカスクリプト」の作者 ivan ivanov(ivan111)さん
・ 「フォントファイルのリンクについて」及び「sprintf」の作者 サラリーマンがハッカーを真剣に目指す さん
に感謝します。