【30日でできる！OS自作入門】【1日目】ブータブルCDのブートセクタを見つける

##はじめに

『<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00IR1HYI0/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">30日でできる! OS自作入門</a>』を読み始めています（1日目）。一応本の通りに手を動かせば実行は出来るわけですが、コピペで進もうと思えば進めてしまうので、気になったところで関連したことを（自分への宿題として）調べていこうと思ったメモです。

##1日目の内容
フロッピーディスクのディスクイメージ（ブートセクタ）をバイナリエディタとアセンブラで作成して最低限起動するプログラムを起動させてみよう、という内容です（具体的な内容はここでは記述しません）。
試しに出来上がったイメージファイルをバイナリエディタで開いてみます。フロッピーディスクイメージは最初の1セクタ(512Byte)がブートセクタとのことなので、以下の図の赤枠部分がブートセクタになります。

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/cd98f698-7d3a-4505-8b50-93b1f251236c.png)

##ブータブルCDのブートセクタはどのように見つけられるのか
フロッピーディスクイメージの起動は先頭のセクタがブートセクタとして読み込まれるらしいですが、例えば、Linuxのインストール等でよく利用するブータブルCDはどのように起動されるのか調べてみました。

###ブータブルCDの規格
ブータブルCDの規格とブートセクタの位置を調べてみると、どうやらブータブルCDのブートセクタはフロッピーディスクのように先頭セクタではないようです。「Boot catalog」という場所にブートセクタの情報が記述されており、「Boot catalog」の場所は「Boot Record Volume Descriptor」という場所に記載されているようです。「Boot Record Volume Descriptor」は場所が固定されているようです。

> ブータブルCD/DVDには標準規格が決まっている。El Torito規格というものである。[…]
> El Toritoでは、Boot Record Volume Descriptor という場所が決められている。（Joliet拡張を使うと多少複雑になるが）ここがスタート地点だ。これは必ず16進数で第11hセクタ、すなわち10進数で第17セクタに存在する。
> 第2章　ブートセクタ http://uiuicy.cs.land.to/bootcd/bootcd2.html

>BRVD : Boot Record Volume Descriptor  Edit
先頭から17(0x11)セクタ目(0x800*0x11 = 0x8800)にBRVDという場所がある。
これは、必ず固定の場所(0x8800～0x9000)にある。
BRVDの0x8847-0x884aのBoot catalogのセクタで指定したセクタがBoot catalogとなる。
El Torito - OS Project Wiki http://www.wiki.os-project.jp/?El%20Torito


###実際のイメージファイルで確認してみる
何となく仕組みがイメージ出来てきたので、実際のイメージファイルでブートセクタを探してみます。今回はUbuntu Server 14.04のイメージファイルを使いました。

####「Boot Record Volume Descriptor」を見てみる
BIOSはまず「Boot Record Volume Descriptor」を確認するようなので、「Boot Record Volume Descriptor」を探してみます。
先頭から17セクタ目（0x8800-0x9000）にあるようなので、この部分をバイナリエディタで見てみます。
下図の赤枠が「Boot Record Volume Descriptor」に該当します。フロッピーディスクと違い、2048Byte/セクタとなります。
この中のどこに「Boot Catalog」へのポインタがあるかというと、「0x8847-0x884a」部分（カーソル選択部分）なので、0x00000781セクタ目ということが分かります（リトルエンディアンになっています）。
次にそこの該当箇所を見てみます。計算すると、0x3C0800Byte目になるので、そこに移動します。

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/77f22579-1ec4-316c-b191-668ff0bc3d4b.png)

下図が見つけたブートカタログになります。何箇所か注目してみます。この中の黄色枠(0x020)が「ブートインディケータ」となっており、ここが0x88だと「ブータブル」だと判定されるようです。
またオレンジ色枠(0x028-0x02b)がブートセクタの開始位置を表すようです。ここでは「0x000002FE」となります。

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/ee5aa20a-526f-ac33-ef10-b57cb9720070.png)

ブートカタログの見方
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/75fac655-8f3b-5949-b274-2373ee2eb429.png)
出展： El Torito - OS Project Wiki http://www.wiki.os-project.jp/?El%20Torito

「0x000002FE」セクタ目は0x107F000Byteなので、そこを確認すると、以下の場所になります。ここがブートセクタとして読み込まれて、ブートローダが実行されるのでしょう。以上。

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/021588f7-f63e-6b09-329e-a647ed9b73b4.png)

##参考
FDの構造とFAT12 物理構造と論理構造 トラック セクタ クラスタ ディレクトリ http://park12.wakwak.com/~eslab/pcmemo/fdfat/index.html

El Torito - OS Project Wiki http://www.wiki.os-project.jp/?El%20Torito

第2章　ブートセクタ http://uiuicy.cs.land.to/bootcd/bootcd2.html

続き： RedhatLinux7.3のブートセクタを見てみる http://www.tomo.ac/goodstream/linux/burn/anarhl73.html

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00IR1HYI0/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41MBrQp6%2B1L._SL160_.jpg" alt="30日でできる! OS自作入門" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00IR1HYI0/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">30日でできる! OS自作入門</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 15.02.07</div></div><div class="amazlet-detail">マイナビ (2006-03-01)<br />売り上げランキング: 23,428<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00IR1HYI0/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>