🐩

【30days自作OS開発記録】1日目:OSは案外楽に出来るもんだぜ。

2024/06/08に公開

はじめに

こんにちは!タクーシュだワン!

今日から僕は、何を思ったのか「きちんとOSの仕組みを知りたい」と思い、OSの仕組みを知るには一度自作でOSを作ってみる経験をするのが良いと考えググった。

その結果、「限られた期限内で開発できる本があるじゃねぇかぁ」と思い、この本をポイントで購入したのだ!!

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

買ってみると、「えっ、めっちゃ分厚いやん!!」 と思ったけど中身の文章を読んでみると、解説が初心者にめっちゃ優しく語り掛ける口調なのが良くて普通のOSの解説本によくある専門用語ごり押しのやつとは違うから、ステップアップしながら自作でOSの開発が出来る訳よね。

1日目 PCの仕組みからアセンブラ入門まで

さて、このタイトルを見ると、「いきなりそんな高度なこと教えるの?」と身構えたくなるでしょうが、そんな身構えさせるような真似はさせねぇよ。

なんせ、私はPCがどのように動くのかという事についてはほぼ無知に等しい上にアセンブラすらもよく分かっていない素人なもんだから、そんな人が解説するとなったらただ一つ。

とにかくやるしかない!!

そんなわけで、まず私は開発環境の準備を行ったわけですが、私のPCはWindows環境で動いており、WSLでLinuxコマンドを叩けるようにしておいたのだよ。

この事前準備をすることで、現環境で自作OSの開発がやりやすくなるのは間違いありません。もしやっていない方がいれば、管理者権限でPowershellを開き、

wsl --install

と叩いて入力するのだ。そして、wslのインストールが終わったらコマンドプロンプトを立ち上げ、以下のコマンドをwslを付けて入力するのだ。

sudo apt install qemu nasm

これで、自作OSを作成するために必要なnasファイルのプログラムとアセンブラを用いた画面出力が出来るようになったわけだ。では、今回はこのリポジトリを用いてそれを実演してみせよう。
https://github.com/sacky3105/my-OS-development/tree/main/01_days

このリポジトリの中に「asm」ファイルと「img」ファイルがあるのですが、nasmコマンドを用いてasmファイルのプログラムをimgファイルにイメージ化して出力するわけよ。

その際、asmファイルの中には以下のプログラムを仕込んでいく~!!

; hello-os
; TAB=4

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"		; ブートセクタの名前を自由に書いてよい(8バイト)
		DW		512				; 1セクタの大きさ(512にしなければいけない)
		DB		1				; クラスタの大きさ(1セクタにしなければいけない)
		DW		1				; FATがどこから始まるか(普通は1セクタ目からにする)
		DB		2				; FATの個数(2にしなければいけない)
		DW		224				; ルートディレクトリ領域の大きさ(普通は224エントリにする)
		DW		2880			; このドライブの大きさ(2880セクタにしなければいけない)
		DB		0xf0			; メディアのタイプ(0xf0にしなければいけない)
		DW		9				; FAT領域の長さ(9セクタにしなければいけない)
		DW		18				; 1トラックにいくつのセクタがあるか(18にしなければいけない)
		DW		2				; ヘッドの数(2にしなければいけない)
		DD		0				; パーティションを使ってないのでここは必ず0
		DD		2880			; このドライブ大きさをもう一度書く
		DB		0,0,0x29		; よくわからないけどこの値にしておくといいらしい
		DD		0xffffffff		; たぶんボリュームシリアル番号
		DB		"HELLO-OS   "	; ディスクの名前(11バイト)
		DB		"FAT12   "		; フォーマットの名前(8バイト)
		TIMES	18	DB	0				; とりあえず18バイトあけておく

; プログラム本体

		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 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		; 改行を2つ
		DB		"hello, world"
		DB		0x0a			; 改行
		DB		0

		TIMES	0x1fe-($-$$)	DB	0			; 0x001feまでを0x00で埋める命令

		DB		0x55, 0xaa

; 以下はブートセクタ以外の部分の記述

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		TIMES	4600	DB	0
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		TIMES	1469432	DB	0

そして、同じフォルダ内に「helloos.img」ファイルを作成し、以下のコマンドを入力するのだ。

nasm -o helloos.img helloos.asm

これにより、asmファイルに記入されたプログラムのイメージが「helloos.img」に出力され、「hello,world」の画面を表示する準備が整ったぜ!!

そしたら、このコマンドで「hello world」を出力するワン。

qemu-system-i386 helloos.img

そうすると、警告文で

と表示されるけど、今は気にする必要はないのだ。

そして、その結果なんと

というOSらしきものがアセンブラだけで出来てしまったのだ。

これ結局何をやったのだ?

これだけ見ても、「結局何をやったんだ?」って甚だ疑問に思う人がいるかもしれないので、軽く解説を入れておくぜ!!

CPUって何?

今回、解説するにあたり要になってくるのがこのCPUなわけだ。CPUとは 「central processing unit」 の略で、日本語に訳すと「中央処理装置」。つまり、こいつがいなければ我々はコンピュータを使用することが出来ないいわばコンピュータの脳みその役割を果たすわけだ。

そして、こいつの処理の出し方だが基本は0か1しか吐き出さない、つまり人間のコミュニケーションで例えるなら、焼肉につけるのはタレか塩かという二択しか答えを出せないという人間からしたら無能でしかない処理しかしないのよね。

では、なぜ0か1の2通りしか値の出力が出来ないのに、現代の我々はPCでコミュニケーションを行うことが出来るのだろうか。それは、コンピュータが2進法での計算をメモリを用いて行うことにより、例えば私たちが「BOOK」と言葉を入力した時、コンピュータは以下のように処理するわけだ。

01001011010011110100111101000010

つまり、コンピュータは我々が入力する言葉を0か1に置き換え、それを瞬時に出力してくれるわけよ。そして、以前までは32個の電気信号によりその値を出力してたわけだが、OSのビット数が32ビットから64ビットに変わったことによって取り扱える言葉も増えたわけだ。

そして、今や古の道具となってしまったフロッピーディスクはこの0と1を磁気のNとSに置き換えた程度のもので、その仕組みによりイメージファイルの保存をフロッピーディスクに出来ていた訳だよ。

だけど、0と1だけで表せられないものは、CPUに処理を渡すことが出来ず、結果PCでは処理できないものになってくるのだワン!

バイナリエディタの役割

先ほどCPUは2進法による自動計算を行っていたのに対して、その2進数を編集する 「バイナリエディタ」 なるものがあるわけだが、こいつが先ほどCPUが吐き出した0と1を編集しファイルにしてしまうわけで、こいつに作れないファイルはないのだ!!

Cのコンパイラーがないよ~って嘆いてるあなたでも、500万画素のデジタルカメラで撮ったJPEGファイルと全く同じ画像がいつでも作れるのだワン!!

それくらいの最強なツールなわけですから、OSくらい作るのは朝飯前な訳だ。

とはいえ、バイナリエディタとか言っておきながらさっきファイルに記載したものにはアルファベットが入ってるやんって突っ込みたくなっただろう。

しかし、2進数のままだと桁が多くなっちゃうからITの業界では主に16進数というものを用いるのだ。例にしてあげると2進数で「0000」と入力した時、それを16進数に変換したら「0」という感じで桁が短くなるわけだ。

ただ、これ以上の解説をしようと思うとかなり難しくなるから以下の内容を参考にするのだ。

https://www.infraexpert.com/study/ip2.html

最後に

先ほど示した、helloos.asmファイルに記入したソースプログラムは、メッセージを気軽に入力出来るようにしておいたので、あとはここにあなたの好きな文字を入力するだけで、どこかの有名な歌ではないけど、世界にひとつだけのOSを作ることが出来るワン。

とはいえ、これではまだまだ世間がイメージしているOSとはかけ離れていて、完成させるのに約1か月はかかるから温かく見守って欲しいワン🐶

To be continued...

Discussion