Master Boot Recordを読む

GPTディスクにもMBRがあるのでそれを読み出すプログラムを書いてみた。

readmbr.c

実行。

$ gcc -o readmbr readmbr.c
$ sudo ./readmbr

 

Boot strap loader
0001: 33 C0 8E D0 BC 00 7C 8E  C0 8E D8 BE 00 7C BF 00
0002: 06 B9 00 02 FC F3 A4 50  68 1C 06 CB FB B9 04 00
0003: BD BE 07 80 7E 00 00 7C  0B 0F 85 0E 01 83 C5 10
0004: E2 F1 CD 18 88 56 00 55  C6 46 11 05 C6 46 10 00
0005: B4 41 BB AA 55 CD 13 5D  72 0F 81 FB 55 AA 75 09
0006: F7 C1 01 00 74 03 FE 46  10 66 60 80 7E 10 00 74
0007: 26 66 68 00 00 00 00 66  FF 76 08 68 00 00 68 00
0008: 7C 68 01 00 68 10 00 B4  42 8A 56 00 8B F4 CD 13
0009: 9F 83 C4 10 9E EB 14 B8  01 02 BB 00 7C 8A 56 00
0010: 8A 76 01 8A 4E 02 8A 6E  03 CD 13 66 61 73 1C FE
0011: 4E 11 75 0C 80 7E 00 80  0F 84 8A 00 B2 80 EB 84
0012: 55 32 E4 8A 56 00 CD 13  5D EB 9E 81 3E FE 7D 55
0013: AA 75 6E FF 76 00 E8 8D  00 75 17 FA B0 D1 E6 64
0014: E8 83 00 B0 DF E6 60 E8  7C 00 B0 FF E6 64 E8 75
0015: 00 FB B8 00 BB CD 1A 66  23 C0 75 3B 66 81 FB 54
0016: 43 50 41 75 32 81 F9 02  01 72 2C 66 68 07 BB 00
0017: 00 66 68 00 02 00 00 66  68 08 00 00 00 66 53 66
0018: 53 66 55 66 68 00 00 00  00 66 68 00 7C 00 00 66
0019: 61 68 00 00 07 CD 1A 5A  32 F6 EA 00 7C 00 00 CD
0020: 18 A0 B7 07 EB 08 A0 B6  07 EB 03 A0 B5 07 32 E4
0021: 05 00 07 8B F0 AC 3C 00  74 09 BB 07 00 B4 0E CD
0022: 10 EB F2 F4 EB FD 2B C9  E4 64 EB 00 24 02 E0 F8
0023: 24 02 C3 49 6E 76 61 6C  69 64 20 70 61 72 74 69
0024: 74 69 6F 6E 20 74 61 62  6C 65 00 45 72 72 6F 72
0025: 20 6C 6F 61 64 69 6E 67  20 6F 70 65 72 61 74 69
0026: 6E 67 20 73 79 73 74 65  6D 00 4D 69 73 73 69 6E
0027: 67 20 6F 70 65 72 61 74  69 6E 67 20 73 79 73 74
0028: 65 6D 00 00 00 63 7B 9A  00 00 00 00 00 00

Partition table entry [0]
  Flag: 00
  First sector(CHS): Cylinder=0,Head=0,Sector=1
  Type: EE
  Last sector(CHS): Cylinder=1023,Head=254,Sector=63
  First sector(LBA): 1
  Sector num: 1953525167

Partition table entry [1]
  Flag: 00
  First sector(CHS): Cylinder=0,Head=0,Sector=0
  Type: 00
  Last sector(CHS): Cylinder=0,Head=0,Sector=0
  First sector(LBA): 0
  Sector num: 0

Partition table entry [2]
  Flag: 00
  First sector(CHS): Cylinder=0,Head=0,Sector=0
  Type: 00
  Last sector(CHS): Cylinder=0,Head=0,Sector=0
  First sector(LBA): 0
  Sector num: 0

Partition table entry [3]
  Flag: 00
  First sector(CHS): Cylinder=0,Head=0,Sector=0
  Type: 00
  Last sector(CHS): Cylinder=0,Head=0,Sector=0
  First sector(LBA): 0
  Sector num: 0

Boot signiture: AA55

 

ブートストラップローダにはプログラムが埋め込まれている様子なので割愛。

パーティションテーブルを見てみる。

  • GPTディスクのため全体が1つのパーティションとして登録される。したがって先頭のエントリにのみ書き込まれている。
  • フラグは0x00。0x80=ブート可, 0x00=ブート不可なのでブート不可ということみたい。
  • セクタ(CHS方式)は最小値と最大値が書き込まれている。
  • パーティション識別子は0xEE。0xEEは「Indication that this legacy MBR is followed by an EFI header」らしい。GPTなので納得。
  • セクタ(LBA方式)は先頭のセクタをあらわす1。
  • セクタ数は1953525167。1セクタあたりのサイズが512Bなので512を掛けてみると1.000204886×10¹²。1TBのディスクなので納得。

最後のブートシグニチャマジックナンバーの0xAA55。これは仕様どおり。