【OS自作入門 ・備忘録】１日目 

#背景
OSについて詳しくなりたいと思い、川合秀実さんの著書「30日でできる!OS自作入門」を購入しました。
理解を深めるために、本読みながら記事書くスタイルで行こうと思います。そのため、まとまっておりません。
１ヶ月で全部読めたら嬉しい！頑張ります

追記：
この本、Windowsで開発進めておる〜:joy:
アベ茶はMacを使用しております

#参考資料
「30日でできる！OS自作入門」川合秀実

#目次
・とにかくやるのだぁ
・結局は何をやったのだろうか
・アセンブラ初体験
・もうちょっと書き直してみる



#1　とにかくやるのだぁ
とにかくやってみた！

**【目標】**
PCの電源ONと同時に自動起動して「Hello World」と画面に出力させる


**【手順】**
バイナリエディター（Hex Find）起動　完了！
16進数を打ち込む　完了！
helloos.imgで保存　完了！
tolset（OS開発に必要なツール）の中に、先ほど作ったhelloos.imgを入れる　完了！
run.batを作成する　完了！
install.batを作成　完了！
フロッピーディスクにインストール　**できません！！**


**【とにかくやってみた結果】**
・フロッピーディスクにプログラミングコードを読見込めず、PCの画面に「Hello World」を出力することができませんでした。
・run.batとinstall.batと.img拡張子とtolsetの中身が全くわりませんでした。


**【考察】**
残りの29日間のことを考えると、windowsの仮想環境作った方がいいかもなー、仮想環境の電源をONにしたら、「Hello World」が画面に出力されるような形がいいなー



run.batとinstal.batのコード読んでみた

```run.batのコードを読んでみた
copy helloos.img ..¥z_tools¥qemu¥fdimage0.bin
..¥z_tools¥make.exe -C ..¥z_tools¥qemu
```

runとは起動するってことだな
hellos.imgをz_toolsのqemuにfdimage0.binとして保存してるのか

[make.exe](http://docwiki.embarcadero.com/RADStudio/Rio/ja/MAKE.EXE)とはなんぞや？
>プロジェクトのコンパイルとリンクのサイクルの管理を支援するコマンドライン ユーティリティ

hellooS.imgと、qemuを紐付けたってことなのかなー
-cとは、自動依存情報をキャッシュすることらしい
よくわからんなー

```install.bat
..¥z_tools¥imgtol.com w a: helloos.img

```
うーん、imgtol.comっていう実行ファイルを起動させてインストールしている。。。のかな

あ、qemuはPCエミュレーターらしい！

run.batは、フロッピーディスクがない人用
instal.batは、フロッピーディスクがある人用で作られているかもしれない

ちなみにうちの環境では、全然動かない:joy:

#2　結局何をやったのだろうか？
0と1をフロッピディスクの磁気のNとSに置き換えた


#3 アセンブラ初体験
今度は直接0と1を入力するのではなく、
著者作のアセンブラ「nask(なすく）」を使用して、helloos.imgを作成する

【**手順**】
・helloos.nasを作成する
・アセンブラのソースプログラムを書き込む
・コンソールで以下のコマンドを入力

```
..¥z_tools¥nask.exe helloos.nas helloos.img
```
著者アセンブラnask.exeを使用して、helloos.nasを読み込み、helloos.imgを生成する

【**アセンブラ文法（Nask)**】
DB命令、RESB命令、0xは16進数、なければ10進数

```ruby:これは同じという認識で良いのかな
DB 0xeb
DB 11101011
```
【**アセンブラのソースプログラムを写経してみた**】

```
; hello-os
; TAB=4

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

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

;プログラム本体

DB 0xb8, 0x00, 0x00, 0x8e, 0xdo, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0c04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd

; メッセージ部分
DB 0x0a, 0x0a ;改行を２つ
DB "hello, world"
DB 0x0a ;改行
DB 0

RESB 0x1fe-$ ; 0x001feまで0x00で埋める命令

DB 0x55, 0xaa

;　以下はブートセクタ以外の部分の記述
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432

```
>文字列をかくと、文字列を構成するそれぞれの文字の文字コードを調べて、それを1バイトずつ並べてくれる。メッセージを変更したい時に、文字コード表とにらめっこしなくていい

なるほど〜
機械語書いてから、アセンブラ言語を書いてみると、プログラミング言語の有り難さを感じる

「RESB 0x1fe -$」は、
$は、この行が先頭から何バイト目か教えてくれる。
0x1feは510バイト目のことらしいのだが、この場所に55 AAを入れないと、フロッピーディスクが困るらしい。

変数$を使用している理由は、メッセージ改造しやすいから

**【混乱タイム　脱線します】**
....はい、2進数、10進数、16進数で混乱しております。
しばらくお待ちください。
:thinking:
:thinking:
:thinking:
:thinking:
:thinking:


:dizzy_face:

:rolling_eyes:

:smirk::smirk::smirk::smirk::smirk::smirk::smirk:

はい、お待たせしました。
まとめます。

DB命令、RESB命令、16進数0x、1バイトで混乱しておりました。

例えば、
アセンブラ文法の0x1fe を　2進数で表すと、「111111110」何ですよ、数えると8ビットしかないじゃないですかー
どこが510バイトだよとか思ってしまったのですが、

そこで登場するのが、DB命令、RESB命令何ですね（あー恥ずかしい、すみませんって感じです）

DB命令で　1バイト単位（8bit)がつくんですね。
DD命令が2バイト
DW命令が4バイト

DB命令 0x1fe 
を2進数、10進数に変換してみると、

２進数
「111111110」バイト

10進数
「510」バイト

で表現できるんだなー

そもそも
「1バイト」って時点で10進数で表現してるんだよなー

だから、基本10進数に合わせないといけないな
bit単位で表示したいなら、
10進数の数字に合わせて510x8 = 4080

「0また1」が合計で4080個あるということですね

あー、数字見たら2進数、10進数、16進数のどれで判断しないといけなくなるな....

頑張ります（気合い）:muscle::muscle::muscle::muscle::muscle:

**【まとめ】**
・フロッピーディスクのブートセレクターにメッセージつきプログラム+00余白で510バイト目に55aaを記述。それ以降も00余白
・フロッピーディスクをPC入れる
・PCがブートセレクターの切れ目になる55aaを発見
・それ以降のプログラムを実行

---
#単語

[**bat拡張子**](https://www.weblio.jp/content/bat)
・テキスト形式で記述された一連の処理命令をコマンドプロンプトを利用して順次実行する、バッチファイルに付く拡張子のことである。

[**バッチファイル**](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
・パソコンなどで、あらかじめ一連の手順を登録しておき、自動的に実行させるためのファイル。

[**bin拡張子**](http://e-words.jp/w/BIN%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html)
・決まったファイル形式などはなく、バイナリ形式のデータやプログラムなどが格納されていることが多い。

[**img拡張子**](https://www.weblio.jp/content/img)
・.imgとは、BHA社の開発したライティングソフト「B's Recoder GOLD」によって作成されたCDイメージファイルに付く拡張子のことである。


[**イメージファイル**](https://www.weblio.jp/content/%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
・記憶装置に記録されたデータを、ファイルやフォルダ構造を保ったまま複製・保存したデータ

[**com拡張子**]
(https://ja.wikipedia.org/wiki/COM%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
・実行可能ファイル形式の一つ

[**実行ファイル**](https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
・コンピュータがプログラムとして解釈実行できるファイル

[**PCエミュレーター**](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))
・エミュレータとは、所定のコンピュータや機械装置の全機能を模倣する機構のこと
・所定の環境で動作するソフトウェアを、ハードウェアやオペレーティングシステムが異なる環境でも動作させることを目的とする。

[**DB命令**]
ファイルの内容を1バイトだけ直接書く命令

[**RESB命令**]
・reserve byteの略。10バイトほど開ける。
・naskでは、開けた部分を0x00で埋めるという意味

[**プロセッサー**](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5)
・コンピュータシステムの中で、ソフトウェアプログラムに記述された命令セット（データの転送、計算、加工、制御、管理など）を実行する（＝プロセス）ためのハードウェアであり、演算装置、命令や情報を格納するレジスタ、周辺回路などから構成される。内蔵されるある程度の規模の記憶装置までを含めることもある。

[**マイクロプロフェッサー**](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5)
・マイクロチップの中にプロセッサーを実装させたもの

[**ブートセレクタ**](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%88%E3%82%BB%E3%82%AF%E3%82%BF)
・コンピュータシステムの電源投入時、あるいはシステムのリセット後、モニタやOSなどなんらかの基本的なシステムソフトウェアを主記憶に展開し、ユーザプログラムを実行できるようにするまでの処理の流れ


[**FAT**]
・フロッピーディスクのフォーマット

[**セクタ**]
・512バイトを1セクター

[**クラスタ**](https://www.otsuka-shokai.co.jp/words/cluster.html)
・

[**ボリュームシリアル番号**]

[**ヘッド**]

[**パーティション**]

[**DW命令**]
・data world
・16ビット= 2バイト

[**DD命令**]
・data double-world
・32ビット = 4バイト

[**IPL**]
・初期プログラム読み込み機
・HELLOIPL
・OSちゃん入ってきてー