MSDDOS(MBR)の修復　未解決(備忘録)

## 趣旨
MSDOSを8086実機で起動できるコンパクトフラッシュを作ろうとしています。
前回の記事(https://qiita.com/earthen94/items/7491ac22a98e4ae823c9)で仮想HDDに対してフロッピーからMSDOSをインストールし実機で実行したところ、「Missing operating system」と表示され立ち上がらないところまで書きました。
パーティションに問題があることが分かりました。

**未解決**ですが試行錯誤の記録を残します

## 調べた基礎知識
MBR(起動可能な記憶媒体の先頭512バイト)の構成は以下の通り。

### 詳細構造（MBR: 全体で512バイト）

| オフセット（Hex） | 大きさ      | 内容                                  |
|--------------------|-------------|---------------------------------------|
| 0x000              | 440B        | OS起動コード |
| 0x1B8              | 4B          | Disk ID         |
| 0x1BC              | 2B          | 未使用（または0x0000）                |
| 0x1BE              | 16B × 4     | パーティションテーブル（4個）         |
| 0x1FE              | 2B          | ブートセクタ署名（0x55AA）            |

※自作OSでは512バイトの大きさと末尾に0x55AAを設定さえしておけば機能しますが、パーティションを使うならこの規則に則って設計する必要があります。

### パーティションテーブルの仕様（1項目 = 16バイト）

1つのパーティション項目（16バイト）の構造は：
| オフセット | 大きさ | 意味                                              |
|------------|--------|---------------------------------------------------|
| +0         | 1B     | アクティブフラグ（0x80 = 起動可能、0x00 = 通常） |
| +1         | 3B     | CHS形式の開始アドレス（通常無視される）          |
| +4         | 1B     | パーティションタイプ（例：0x06 = FAT16）         |
| +5         | 3B     | CHS形式の終了アドレス（通常無視される）          |
| +8         | 4B     | パーティションの開始セクタ（LBA）                |
| +12        | 4B     | パーティションのセクタ数（LBA）                  |


## 解決方法
以下はMBRのDUMP。
```
test@test-ThinkPad-X280:~$ sudo xxd -g1 -l512 msdos_hdd.img
00000000: fa 33 c0 8e d0 bc 00 7c 8b f4 50 07 50 1f fb fc  .3.....|..P.P...
00000010: bf 00 06 b9 00 01 f2 a5 ea 1d 06 00 00 be be 07  ................
00000020: b3 04 80 3c 80 74 0e 80 3c 00 75 1c 83 c6 10 fe  ...<.t..<.u.....
00000030: cb 75 ef cd 18 8b 14 8b 4c 02 8b ee 83 c6 10 fe  .u......L.......
00000040: cb 74 1a 80 3c 00 74 f4 be 8b 06 ac 3c 00 74 0b  .t..<.t.....<.t.
00000050: 56 bb 07 00 b4 0e cd 10 5e eb f0 eb fe bf 05 00  V.......^.......
00000060: bb 00 7c b8 01 02 57 cd 13 5f 73 0c 33 c0 cd 13  ..|...W.._s.3...
00000070: 4f 75 ed be a3 06 eb d3 be c2 06 bf fe 7d 81 3d  Ou...........}.=
00000080: 55 aa 75 c7 8b f5 ea 00 7c 00 00 49 6e 76 61 6c  U.u.....|..Inval
00000090: 69 64 20 70 61 72 74 69 74 69 6f 6e 20 74 61 62  id partition tab
000000a0: 6c 65 00 45 72 72 6f 72 20 6c 6f 61 64 69 6e 67  le.Error loading
000000b0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
000000c0: 6d 00 4d 69 73 73 69 6e 67 20 6f 70 65 72 61 74  m.Missing operat
000000d0: 69 6e 67 20 73 79 73 74 65 6d 00 00 00 00 00 00  ing system......
000000e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01  ................
000001c0: 01 00 06 0f 3f dd 3f 00 00 00 e1 69 03 00 00 00  ....?.?....i....
000001d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa  ..............U.
```

MBRの0x1BE〜にはパーティションテーブルが置かれている。
```
000001be: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01
000001c0: 01 00 06 0f 3f dd 3f 00 00 00 e1 69 03 00 00 00
```

1個目のパーティション
```
0x1BE:
Boot Flag:         00 ← アクティブでない（非ブート）
CHS Begin:         00 00 00
Type:              00 ← 不明
CHS End:           00 00 00
LBA Start:         00000000
LBA Length:        00000000
```

2個目
Boot Flagが80となっているが属性が0F(拡張)となっておりこれでは起動ができない。
```
0x1C0:
Boot Flag:         80 ← アクティブ
CHS Begin:         01 00 06
Type:              0F ← 拡張パーティション（LBA方式）
CHS End:           3F DD 3F
LBA Start:         0000003F
LBA Size:          000369E1 （約 222,561 セクタ ≒ 約 108MB）
```

実機で動かすためには拡張パーティションではなく基本パーティションを先頭に設置し、且つ起動可能に設定する必要がある。
以下の手順でパーティションテーブルの先頭の項目を起動可能なパーティションとして設定する。
```
sudo fdisk msdos_hdd.img

# 手順（fdisk内で）:
# - d（削除）
# - n（新規作成）→ p（基本）→ 1番→ 初期選択のまま
# - t（タイプ変更）→ 6（FAT16）
# - a（アクティブ設定）
# - w（書き込み）
```
```
test@test-ThinkPad-X280:~$ sudo fdisk msdos_hdd.img

欢迎使用 fdisk (util-linux 2.37.2)。
更改将停留在内存中，直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助)： d
已选择分区 1
分区 1 已删除。

命令(输入 m 获取帮助)： n
分区类型
   p   主分区 (0 primary, 0 extended, 4 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p)： p
分区号 (1-4, 默认  1): 1
第一个扇区 (2048-225279, 默认 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-225279, 默认 225279): 

创建了一个新分区 1，类型为“Linux”，大小为 109 MiB。

命令(输入 m 获取帮助)： t
已选择分区 1
Hex code or alias (type L to list all): 6
已将分区“Linux”的类型更改为“FAT16”。

命令(输入 m 获取帮助)： a
已选择分区 1
分区 1 的 可启动 标志已启用。

命令(输入 m 获取帮助)： w
分区表已调整。
正在同步磁盘。
```
※筆者の使っているOSが中国語なので、少し見づらいかもしれませんが敢えて訳さずそのまま貼り付けました。


## 実機確認
「Missing operating system」と表示されていましたが「Error loading operating system」という表示に変わりました。
![default(1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/73688562-043c-4d14-81a6-04e81181fa17.jpeg)


## パーティションを直したあとのダンプ
```
test@test-ThinkPad-X280:~$ sudo xxd -g1 -l512 msdos_hdd.img
00000000: fa 33 c0 8e d0 bc 00 7c 8b f4 50 07 50 1f fb fc  .3.....|..P.P...
00000010: bf 00 06 b9 00 01 f2 a5 ea 1d 06 00 00 be be 07  ................
00000020: b3 04 80 3c 80 74 0e 80 3c 00 75 1c 83 c6 10 fe  ...<.t..<.u.....
00000030: cb 75 ef cd 18 8b 14 8b 4c 02 8b ee 83 c6 10 fe  .u......L.......
00000040: cb 74 1a 80 3c 00 74 f4 be 8b 06 ac 3c 00 74 0b  .t..<.t.....<.t.
00000050: 56 bb 07 00 b4 0e cd 10 5e eb f0 eb fe bf 05 00  V.......^.......
00000060: bb 00 7c b8 01 02 57 cd 13 5f 73 0c 33 c0 cd 13  ..|...W.._s.3...
00000070: 4f 75 ed be a3 06 eb d3 be c2 06 bf fe 7d 81 3d  Ou...........}.=
00000080: 55 aa 75 c7 8b f5 ea 00 7c 00 00 49 6e 76 61 6c  U.u.....|..Inval
00000090: 69 64 20 70 61 72 74 69 74 69 6f 6e 20 74 61 62  id partition tab
000000a0: 6c 65 00 45 72 72 6f 72 20 6c 6f 61 64 69 6e 67  le.Error loading
000000b0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
000000c0: 6d 00 4d 69 73 73 69 6e 67 20 6f 70 65 72 61 74  m.Missing operat
000000d0: 69 6e 67 20 73 79 73 74 65 6d 00 00 00 00 00 00  ing system......
000000e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00  ................
000001c0: 21 02 06 07 37 df 00 08 00 00 00 68 03 00 00 00  !...7......h....
000001d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa  ..............U.
```

## やり直し

```
test@test-ThinkPad-X280:~$ sudo fdisk msdos_hdd.img
[sudo] test 的密码： 

欢迎使用 fdisk (util-linux 2.37.2)。
更改将停留在内存中，直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助)： d
已选择分区 1
分区 1 已删除。

命令(输入 m 获取帮助)： n
分区类型
   p   主分区 (0 primary, 0 extended, 4 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p)： p
分区号 (1-4, 默认  1): 1
第一个扇区 (2048-225279, 默认 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-225279, 默认 225279): 

创建了一个新分区 1，类型为“Linux”，大小为 109 MiB。

命令(输入 m 获取帮助)： t
已选择分区 1
Hex code or alias (type L to list all): 6
已将分区“Linux”的类型更改为“FAT16”。

命令(输入 m 获取帮助)： a
已选择分区 1
分区 1 的 可启动 标志已启用。

命令(输入 m 获取帮助)： w

分区表已调整。
正在同步磁盘。
```

又「Missing operating system」と表示されるようになってしまった。
![default.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/fd2a7b84-5be0-4f08-82d9-1db4f366cc6f.jpeg)