Macで「30日でできる!OS自作入門」の進め方と簡単な書評
いい本でした
最終的な成果物はこちら
環境構築
基本的にはこちらのQiitaの記事を参考にして環境構築を行います.
進め方
リポジトリは完成形が置かれていてmake run
するといい感じに動くようにやってくれています.
僕は自分でコードを書きながら進めたかったので,リポジトリのコードを写経しながら進めました. 具体的には以下のような形で進めました.
- リポジトリのメインとなるファイル(
helloos.nas
やipl.nas
)をリネーム - メインとなるファイルを作成 or 1つ前の章で作成したものをコピペ
- リネームしたものにコードを書く(本家のリポジトリor参考のリポジトリを写経)
リポジトリのものを写経するのは,本にはソースコードの全体像が載ってないからです. 本にも書かれてますが「プログラムがメインで,その添付資料が本」みたいな感じです(作者じゃない読者がこれを言うと色々批判がありそうですが,悪い意味ではありません)
macでやると,本と同じようにできないので結構つまづきます.躓いたらzacfukudaさんのリポジトリを参考にしてました.
どこで躓いて,どう対応したかを丁寧に書いてくださっていますので,macユーザーにはとても助けになると思います.
得られた知識
OSがどうやって画面を描画しているか,OSの基礎的な知識と学校の授業でも習わないような詳細な知識とテクニックを学べました.
例えば...
- メモリ領域を守るために,CPUの機能を使ってメモリへの不正なアクセスを防ぐ
- キーボードやマウスの入力があった場合の割り込み処理の実装
- 割り込み処理をできるだけ短時間にするための工夫
- OSのAPIを作成し,APIを利用したアプリケーションの開発
などなど.
OSってどうやって動いてんの〜みたいなところが学べたので,PCとかスマートフォンのOSってすげぇな!って思うようになりました笑
その他
高速化したつもりがカクカクなる
これは今のPCが高機能すぎるがゆえ起こることらしい.
エラーの対応
結構最初にでてきたこのエラー...
error: attempt to reserve non-constant quantity of BSS space
これは以下のブログを参考にして解決しました!
18日目のharib15gでstrcmp関数を自作するときはこちらを参考にしました. stdio.hとかはincludeできないので諸々自作していきます.
http://bttb.s1.valueserver.jp/wordpress/blog/2018/02/12/makeos-18/
20日目にmapファイルを見たい場合は以下のオプションをつけると良さそうです
-Wl,-Map=bootpack.map
Makefileはこんな感じ
OBJS_BOOTPACK = bootpack.o graphic.o dsctbl.o naskfunc.o hankaku.o mysprintf.o int.o fifo.o keyboard.o mouse.o memory.o sheet.o timer.o mtask.o mystrcmp.o file.o window.o console.o CC = i386-elf-gcc CFLAGS = -m32 -fno-builtin bootpack.hrb : $(OBJS_BOOTPACK) hrb.ld $(CC) $(CFLAGS) -march=i486 -nostdlib -Wl,-Map=bootpack.map -T hrb.ld -g $(OBJS_BOOTPACK) -o $@
27日目にライブラリを作るんですが ld
とかar
だとうまくいかないので,以下のコマンドでライブラリ化してました.
OBJS_API = api001.o api002.o api003.o api004.o api005.o api006.o \ api007.o api008.o api009.o api010.o api011.o api012.o \ api013.o api014.o api015.o api016.o api017.o api018.o \ api019.o api020.o api021.o api022.o api023.o api024.o api025.o \ api026.o api027.o apilib.a : $(OBJS_API) i386-elf-ar rcs $@ $^