Wiita

自分にとってのメモと, プログラミングに関する情報を発信していきます. サイト名の意味は特にありません.

Macで「30日でできる!OS自作入門」の進め方と簡単な書評

いい本でした

30日でできる! OS自作入門

30日でできる! OS自作入門

最終的な成果物はこちら

github.com

環境構築

基本的にはこちらのQiitaの記事を参考にして環境構築を行います.

qiita.com

リポジトリ

github.com

進め方

リポジトリは完成形が置かれていてmake run するといい感じに動くようにやってくれています.

僕は自分でコードを書きながら進めたかったので,リポジトリのコードを写経しながら進めました. 具体的には以下のような形で進めました.

  1. リポジトリのメインとなるファイル(helloos.nasipl.nas)をリネーム
  2. メインとなるファイルを作成 or 1つ前の章で作成したものをコピペ
  3. リネームしたものにコードを書く(本家のリポジトリor参考のリポジトリを写経)

リポジトリのものを写経するのは,本にはソースコードの全体像が載ってないからです. 本にも書かれてますが「プログラムがメインで,その添付資料が本」みたいな感じです(作者じゃない読者がこれを言うと色々批判がありそうですが,悪い意味ではありません)

macでやると,本と同じようにできないので結構つまづきます.躓いたらzacfukudaさんのリポジトリを参考にしてました.

どこで躓いて,どう対応したかを丁寧に書いてくださっていますので,macユーザーにはとても助けになると思います.

github.com

得られた知識

OSがどうやって画面を描画しているか,OSの基礎的な知識と学校の授業でも習わないような詳細な知識とテクニックを学べました.

例えば...

  • メモリ領域を守るために,CPUの機能を使ってメモリへの不正なアクセスを防ぐ
  • キーボードやマウスの入力があった場合の割り込み処理の実装
  • 割り込み処理をできるだけ短時間にするための工夫
  • OSのAPIを作成し,APIを利用したアプリケーションの開発

などなど.

OSってどうやって動いてんの〜みたいなところが学べたので,PCとかスマートフォンのOSってすげぇな!って思うようになりました笑

その他

高速化したつもりがカクカクなる

これは今のPCが高機能すぎるがゆえ起こることらしい.

kawasin73.hatenablog.com

エラーの対応

結構最初にでてきたこのエラー...

error: attempt to reserve non-constant quantity of BSS space

これは以下のブログを参考にして解決しました!

admarimoin.hatenablog.com


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 $@ $^