1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MBR(マスターブートレコード)を解剖する

Posted at

背景

fdiskコマンドとかで何気なくパーティションをいじくっている中で、
パーティションテーブルを持っているMBRくんおことを全然知らないと思って調査してみた備忘録。

調査

MBR(マスターブートレコード)

HDDなどの記憶媒体の最初のセクタ(512bytes)に存在する特殊なレコード。
OSの読み込みだったり、ディスクパーティションの情報だったり、
重要な情報がこの512Bytesの中に入っている。

MBRの構成がどうなっているのか

MBRは1セクタ分の容量 = 512Byteで構成されており、
BIOS形式のMBRの場合、具体的には下記の情報が含まれる

Byte Offset 容量 内容 備考
00~445 446Bytes ブートストラップローダ
446~461 16Bytes 1st パーティションテーブル
462~477 16Bytes 2nd パーティションテーブル
478~493 16Bytes 3rd パーティションテーブル
494~509 16Bytes 4th パーティションテーブル
510~511 1Bytes ブートシグニチャ MBRの有効性を示す特定値

【想像】なぜ標準パーティションが4つしか持てないのか

BIOS形式のディスクって標準パーティションが4つしか持てないのは、
MBRレコードの中にパーティションを示す領域を16byte * 4 = 64byte分しか用意できなかったからかな?
この設計が現代まで生きているので、標準パーティションは4つまでしか作れないということかな・・・

ブートストラップローダの構造

ものすごく端折って言ってしまえば、OS起動用のパーティションを作成し読み込むための関数が設置されている。

具体的には、下記のような動作を行っているらしい。

  1. パーティションテーブルの検査
  2. 4つのテーブルエントリーを先頭から順に検査し、起動可能な(起動フラグの立った)基本領域がないか探す。
  3. 見つかったら、その領域の先頭位置をテーブルから取得する。  BIOSにその位置を示して、当該先頭セクターをメモリーにロードしてもらう。
  4. ロードした先頭セクターに制御を移す。

引用:http://nobusan.jp/computer/boot/bootstrap.html

②の起動フラグの立った基本領域というのは、後述するパーティションテーブルのブートフラグのことと考えられる。
あくまでMBRのブートストラップローダは、OS起動用パーティションを見つけて読み込むことだけを目的としていて、
OSの起動自体は、起動用パーティションのPBR(PartitionBootRecord)が実施するものと思う。

パーティションテーブルの構造

パーティションテーブルは16Byteで構成されており、構造は下記のようになっている

容量 内容 備考
1byte ブートフラグ 起動パーティションとして利用可能かを示す値(0x80 → 可 / 0x00 → 不可)
3byte 開始セクタ(CHS) 使用されていない
1byte パーティション識別子(システムID) ファイルシステムを値で指定する(参考
3byte 最終セクタ(CHS) 使用されていない
4byte 開始セクタ(LBA)
4byte パーティションの総セクタ数(LBA)

【疑問点】CHSって何?なぜ使用されていない?

CHSは「Cylinder Head Sector」の略で、シリンダー(C)・ヘッド(H)・セクター(S)の三つの頭文字で作られている。
古いハードディスクの読み書き場所の指定に使われていた方式?らしい。
恐らくは、古い形式の要素であるため、現在は使用されていない、いうことだと考えられる。

【疑問点】LBAって何?

LBAは「Logical Block Address」の略。
ディスクの各セクタに「論理ブロック」と呼ばれる通し番号を振り、
この番号を指定することで、任意のセクタにアクセスするロジック。
CHSはディスクアクセスの際に複数の情報だったが、こっちのほうがシンプルで使いやすいのかな。
CHSが使用されていない、ということは、基本的にはこちらが利用されているものと考えられる

【想像】MBRの2TBの壁の正体

BIOS形式のMBRで作成できるパーティションの最大サイズは2TBという話は有名で、
これの正体はパーティションテーブルの末尾4Byteに示す「パーティションの総セクタ数」に関係があると思う。
4Byteは-2,147,483,648~2,147,483,647の値を表現することが可能なので、最大で4,294,967,296の値を表現することができる。
つまり、パーティションの総セクタ数としてして利用できるのも4,294,967,296個までということになる。
1セクタが512Byteだから、
4,294,967,296 × 512 = 2,199,023,255,552
となり、おおよそ2TBまでがパーティションで利用できる容量の最大値ということになる。

【想像】ディスク容量を指定するときに512Byteの倍数で指定する理由

これもパーティションテーブルの末尾に示す、「パーティションの総セクタ数」に関係がある
容量は1Byte単位で指定するわけじゃなくて、あくまで利用するセクタ数で判断されるため、
1セクタ=512Byteだから、Byte指定する場合は512の倍数にしないといけない、ということ。

##ブートシグニチャについて
MBRの最後の1byteに書き込まれているマジックナンバー的なもの。
「0xAA55」が書き込まれていなければ、無効なMBRとして判断される。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?