Help us understand the problem. What is going on with this article?

『30日でできる!OS自作入門』を macOS Catalina で実行する

『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 FRIEND

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についてのページ - hrb-wiki

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)」では、

「『30日でできる!OS自作入門』のメモ」

のページの「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を少し修正した。

mysprintf.c
//va_start (list, 2);
va_start (list, fmt); 

独自の sprintf関数を使うので、bootpack.cも修正する。

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

実行して、以下のようなウィンドウが表示されれば、成功!
day1-2

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

参考

※註)

macOSとはいえ、ほとんどLinuxと環境なので、検索キーワードに Linux を入れるとヒットすることがある。

ただし、macOS の gccは、実態は clangなので、そこで苦労したりする。

謝意

「リンカスクリプト」の作者 ivan ivanov(ivan111)さん

「フォントファイルのリンクについて」及び「sprintf」の作者 サラリーマンがハッカーを真剣に目指す さん

に感謝します。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away