カーネル/VM Advent Calender 2011参加記事。
03-Dec-2011 [USBメモリデバイスのCHS値]

今でこそLBA(Logical Block Address)を使用するものの、かつてはHDD上のデータの位置はC(Cylinder), H(Head), S(Sector)の三つのパラメータで表現していました。これはHDDの構造に由来するものでありますが、このような構造を持たないメモリデバイス…SDカードやUSBメモリではどのようになるか、少し調べてみることにしました。

調べるために使用したプログラムは、chstest.asmというごくごく簡単なものです。BIOSのINT13Hを使用し、CHSの値を取得します。また、拡張INT13Hも使用しています。試してみたい場合はnasmでアセンブルし、ddか何かでディスクのブートセクタに仕込めば良いでしょう。

このプログラムを起動すると画面には8桁の16進数が7個表示されますが、これは次のような意味を持っています。

  1. 起動したディスクの番号(DLレジスタの値)
  2. INT13H, AH=08Hで取得したシリンダ数
  3. INT13H, AH=08Hで取得したヘッド数
  4. INT13H, AH=08Hで取得したセクタ数
  5. INT13H, AH=48Hで取得したシリンダ数
  6. INT13H, AH=48Hで取得したヘッド数
  7. INT13H, AH=48Hで取得したセクタ数

起動したディスクの番号は、bit7=0はFDD扱い、bit7=1はHDD扱いという意味で構いません。

INT13H, AH=08Hで取得したシリンダ数およびヘッド数は、0〜指定可能な最大数という意味があるために実際の値-1で表示されます。

手元の機材で試した結果を見る限りでは、以下のような傾向があるようです。

  • 同じメモリデバイスを使用しても、BIOSによってCHS数が変わる
  • 同じメモリデバイスを使用しても、BIOSによってFDD扱いとなる場合とHDD扱いになる場合がある
  • SDカードの場合、SDカードリーダーを変えても違いは生じない
  • BIOSではなくUEFIの場合、INT13Hと拡張INT13Hとで結果が異なる場合がある

正直なところ、(もともとメモリデバイスにCHSという概念が無い以上)ここまで混沌とした状態とは思ってもいませんでした。HDDのようにLBAを使用してアクセスを行うのであるなら特に問題は起こらないでしょうが、CHS値を使用してアクセスを行ったり、フロッピーディスクイメージをUSBメモリに書き込んで起動するような場合は注意が必要でしょう。

なお、chstest.asmが起動しなかったThinkPad Edge 525Eの場合、FATのような情報を付加する(chstest2.asm)もしくはパーティーションテーブルを付加する(chstest3.asm)ことで起動するようになることが分かっています(それ以前に、セグメントレジスタの初期化を端折っていることの方が大きな問題ですが…)。

どうも、このマシンではブートセクタの内容を解釈して自動的にFDDかHDDかを返し、またCHS値もブートセクタの内容から決定しているような感触なのですが…どこをどのように設定するとどう変化するかまでは追いきれていません。

とりあえず、USBに接続したメモリデバイスから起動する場合、CHSの値には注意した方が良いという結論でこの記事はまとめておくことにします。

30-Nov-2011 [使用機材]

PC

  • BIOSTAR P4M80-M4/Celeron 2.4GHzが載っている自作機
  • FOXCONN A7GM-S/AthlonX2 5050e+が載っている自作機
  • Intel DG41TY/Pentium Dual-Core E6700が載っている自作機
  • ASRock A75 Pro4/A8-3850が載っている自作機
  • Lenovo ThinkPad Edge 525/A8-3500M

USBメモリ

  • USB1.1時代の32Mbyte物・メーカー不明(分解したらPHISONのコントローラが載ってた) (64000 sectors)
  • SanDisk Cruzer mini 256MB (501759 sectors)

USB接続のSDカードリーダ

  • Apacer・型番不明(ALCOR MICRO AU6331搭載品)
  • Princeton PRD-802(ICSI IC1210搭載品)
  • ELECOM MR-A39HWHF1(コントローラは不明)

SDカード(全てSDサイズに変換して使用)

  • SanDisk 32MB (miniSD, 59776 sectors)
  • Apacer 128MB (miniSD, 250880 sectors)
  • Transcend 2GB (microSD, 3911680 sectors)
  • BarunFlash 2GB (microSD, 3936256 sectors)

これらの機材を、総当たり式で組み合わせて調査した。

26-Nov-2011 [テスト結果(chstest.asm)]

SDカードの名称の後にあるAp, Pr, Elは、使用したSDカードリーダーのメーカーの略称(Apacer, Princeton, ELECOM)。

本来であれば8桁の16進数で記すべきであるが、見づらいのでゼロサプレスしたものを掲載している。

・BIOSTAR P4M80-M4 (Phoenix - Award)

Stick Drive 32MB803ef3f3f103f
Cruzer 256MB801f0f3f1f1103f
SanDisk 32MB miniSD/Ap803af3f3b103f
Apacer 128MB miniSD/Ap80f7f3ff8103f
Transcend 2GB microSD/Ap803c93f3f3ca403f
BarunFlash 2MB miniSD/Ap803cf3f3f3d0403f
SanDisk 32MB miniSD/Pr起動不可
Apacer 128MB miniSD/Pr起動不可
Transcend 2GB microSD/Pr起動不可
BarunFlash 2MB miniSD/Pr起動不可
SanDisk 32MB miniSD/El803af3f3b103f
Apacer 128MB miniSD/El80f7f3ff8103f
Transcend 2GB microSD/El803c93f3f3ca403f
BarunFlash 2MB miniSD/El803cf3f3f3d0403f

・FOXCONN A7GM-S (AMI)

Stick Drive 32MB01e1f3f1f203f
Cruzer 256MB0f71f3ff8203f
SanDisk 32MB miniSD/Ap01c1f3f1d203f
Apacer 128MB miniSD/Ap07b1f3f7c203f
Transcend 2GB microSD/Ap803c93f3f3ca403f
BarunFlash 2MB miniSD/Ap803cf3f3f3d0403f
SanDisk 32MB miniSD/Pr01c1f3f1d203f
Apacer 128MB miniSD/Pr07b1f3f7c203f
Transcend 2GB microSD/Pr803c93f3f3ca403f
BarunFlash 2MB miniSD/Pr803cf3f3f3d0403f
SanDisk 32MB miniSD/El01c1f3f1d203f
Apacer 128MB miniSD/El07b1f3f7c203f
Transcend 2GB microSD/El803c93f3f3ca403f
BarunFlash 2MB miniSD/El803cf3f3f3d0403f

・Intel DG41TY (Intel)

Stick Drive 32MB801e3f201f4020
Cruzer 256MB80f33f20f44020
SanDisk 32MB miniSD/Ap801c3f201d4020
Apacer 128MB miniSD/Ap80793f207a4020
Transcend 2GB microSD/Ap803753f207764020
BarunFlash 2MB miniSD/Ap803813f207824020
SanDisk 32MB miniSD/Pr801c3f201d4020
Apacer 128MB miniSD/Pr80793f207a4020
Transcend 2GB microSD/Pr803753f207764020
BarunFlash 2MB miniSD/Pr803813f207824020
SanDisk 32MB miniSD/El801c3f201d4020
Apacer 128MB miniSD/El80793f207a4020
Transcend 2GB microSD/El803753f207764020
BarunFlash 2MB miniSD/El803813f207824020

・ASRock A75 Pro4 (AMI)

Stick Drive 32MB801e3f201f4020
Cruzer 256MB80f33f20f44020
SanDisk 32MB miniSD/Ap801c3f201d4020
Apacer 128MB miniSD/Ap80793f207a4020
Transcend 2GB microSD/Ap803753f207764020
BarunFlash 2MB miniSD/Ap803813f207824020
SanDisk 32MB miniSD/Pr801c3f201d4020
Apacer 128MB miniSD/Pr80793f207a4020
Transcend 2GB microSD/Pr803753f207764020
BarunFlash 2MB miniSD/Pr803813f207824020
SanDisk 32MB miniSD/El801c3f201d4020
Apacer 128MB miniSD/El80793f207a4020
Transcend 2GB microSD/El803753f207764020
BarunFlash 2MB miniSD/El803813f207824020

・Lenovo ThinkPad Edge 525

全く起動しない。MikeOS-4.2は起動するので、おそらくテストコードに問題がある。


uaa@uaa.org.uk