SF16のページ

  • メディアの総容量に関わらず、FAT12になるのを回避し、FAT16にしてしまう、Kが提案したフォーマット。
    • FAT12はFATの管理がややこしいが、FAT16はやさしい。
  • FATの位置やルートディレクトリの位置とエントリ数などが固定されているために、ソフトウェアからは非常に扱いやすい。
  • ディスクイメージをほんの少しいじるだけで、2GBまでのメディアに柔軟に対応可能。
  • セクタがきれいにアラインされている。
    • これによりメモリカードなどでは、書き込み速度の向上や、寿命延長などの効果が期待できる。
      • ただしSF16_40じゃないと効果がないだろうと思われる。
  • 特にSF16_40がよく使われる(32KBクラスタ)。
    • 他にSF16_08(4KBクラスタ)とSF16_01(0.5KBクラスタ)がある。
    • もちろん20、10、04、02もあるが、そこまでサポートしなくてもSF16対応と名乗っていい。
  • Windowsはフォーマットシグネチャを読まずに、容量だけでFAT16かFAT12を決め付ける仕様になっている。このせいで容量が小さいメディアを普通にSF16にすると、FAT12と誤認され正しくアクセスできない。これを回避するためにSF16仕様では、少ない容量メディアに対してのみ不良セクタが末尾にたくさんあるように見せかけることを許す。
    • 当然この場合でも空き容量は正しく表示される(総容量が最大容量になる)。
    • imgtol0ではfコマンドでこの誤認回避のための処置を自動で行なうが(もちろん総容量が十分にあるときは行なわない)、これを抑制することも可能。
      • 抑制するには、fコマンドではなくFコマンドを使う。
      • その場合、たぶんWindowsでは誤認して読み書きできなくなるので注意が必要。
    • pcctol0ではfコマンドでこの誤認回避のための処置を自動で行なうが(もちろん総容量が十分にあるときは行なわない)、これを抑制することも可能。
      • 抑制するには、fコマンドではなくeコマンドを使う。
      • その場合、たぶんWindowsでは誤認して読み書きできなくなるので注意が必要。
    • SF16に正式対応したOSやツールでは、この処置がされていてもメディアの総容量は常に正しく認識される。
  • サポートできる容量範囲:
    • 星の数はおすすめ度数
    • (Win対策しなくなる容量については、技術的な参考のために書いただけで、気にする必要はありません。)
      フォーマットクラスタサイズ最大容量Win対策しなくなる最低容量
      SF16_40 **32KB2GB128.4MB
      SF16_2016KB1GB64.4MB
      SF16_108KB512MB32.4MB
      SF16_08 *4KB256MB16.4MB
      SF16_042KB128MB8.4MB
      SF16_021KB64MB4.4MB
      SF16_01 *512B32MB2.4MB

フォーマット

  • SF16ではセクタ単位で考えるのではなく、すべてバイト単位で考える。したがって、セクタサイズが違ってもディスクイメージは同じになる。
    • 純粋なFAT16として見た場合、データは512バイトセクタのときのパラメータになっている。
      0000_0000 - 0000_004F80BブートセクタのうちのSF16情報領域
      0000_0050 - 0000_01EF416BブートセクタのうちのOS用開放領域
      0000_01F0 - 0000_01FF16B(ブートセクタのうちのKHBIOS用情報領域)
      0000_0200 - 0000_02034B(Win95スキャンディスクバグ回避用領域)
      0000_0204 - 0000_5FFF23.5KBリザーブ領域のうちのOS用開放領域
      0000_6000 - 0000_7FFF8KB(リザーブ領域のうちのKHBIOS用情報領域)
      0000_8000 - 0002_7FFF128KBFAT
      0002_8000 - 0004_7FFF128KBFATのコピー
      0004_8000 - 0004_FFFF32KBルートディレクトリ
      0005_0000 -ファイル領域
  • ブートセクタのうちのSF16情報領域:
    000  jj jj jj jj jj jj jj jj jj jj jj 00 02 ## 40 00
    010  02 00 04 xx xx F8 00 01 ?? ?? ?? ?? ?? ?? ?? ??
    020  xx xx xx xx ?? ?? 29 ?? ?? ?? ?? jj jj jj jj jj
    030  jj jj jj jj jj jj 46 41 54 31 36 20 20 20 jj jj
    040  53 46 31 36 xx xx 00 x0 xx xx xx xx 00 00 00 00
    050  - これ以降は01F0まですべてjj -
    1F0  kk kk kk kk kk kk kk kk kk kk kk kk kk kk jj jj
    • jjは自由なバイト。いかなる用途に使ってもよい。ただし000-04Fの範囲については、FAT16におけるシグネチャやボリュームネーム情報部分だったりするので、ツール等で破壊される恐れがある。
    • ??はFAT16でインストール先のメディアに併せてKHBIOS系のツールが書き換える可能性があるバイト。
    • ##はクラスタサイズ。
    • kkはKHBIOS用のリザーブとしてもっともふさわしいところだが、まあ空きがなければないで、KHBIOS側でなんとかできる。余裕があったら空けておくのが吉。
    • xxはパーティション容量を表わすバイト。
      • 048-04B:ファイル領域の総クラスタ数 * ## + 0x280。
      • 044-045:アクセス可能な最大クラスタ番号 + 1(つまりファイル領域の総クラスタ数 + 2)。
      • 047のbit4-7:拡張フラグ(デフォルトは0000)
      • 020-023:048-04Bのコピー、もしくは、Windowsを騙すために0xffee * ## + 0x280。
      • 013-014:もし022-023が0000なら、ここは020-021のコピー。そうでなければ、ここは0000。
    • 00B-00C:SF16では実際のセクタサイズに関係なく、常に0200に固定。
  • Win95スキャンディスクバグ回避用領域:
    0200 F8 FF FF FF
  • 拡張フラグについて
    • bit4:FATが特殊形式だと1。特殊形式とは、FATのチェインが次のクラスタをさしている部分をfffeに置換しただけのものである。また第二FATはオールゼロ。
    • bit5:全てのファイルが連続したクラスタに配置されているモードだと1。
    • bit6:リザーブ。
    • bit7:リザーブ。
    • これらの拡張フラグについてはサポートしなくても良いが、できればチェックはして、理解できない状況であればエラーにするくらいの対応をしてもらえるとうれしい。
  • (参考)
    • KHBIOS関連ツールで初期化した場合では「MBR+リザーブ」で64KBを確保し、パーティションサイズはすべて64KB単位で確保されるため、このSF16フォーマットを採用すると、ブートセクタ位置とファイル領域開始位置は64KBアライン、FAT開始位置とルートディレクトリ開始位置は32KBアラインされることになる。

SF16 のメリット

  • アラインに配慮されており、メモリカードの消去ブロックとの相性がよい。
  • MOやCD-ROMなどセクタ長が異なる場合でも、ディスクイメージが同一になり、ファイルシステムドライバは単純化可能。
  • ディスクイメージを少しいじるだけで容易に総容量を変更できる。
    • たとえば128MB用のディスクイメージを1.5GBのパーティションに書き込むことができる。
  • 可変長部分が少ないのでFAT16をフルサポートするよりも楽。
  • FAT16をサポートしていれば、SF16も読み書きできる。
    • SF16しかサポートしないプログラムからは、FAT16は扱いきれない。
    • だから2GB以下のデバイスは、みんなSF16になっちゃえばいいと思う。
      • HDDやメモリカード類はもちろんのこと、CD-ROM、FD、MO、ZIPなども。

SF16 のデメリット

  • FAT16のサブセットでしかないため、FAT16に存在する欠陥を全て引き継ぐ。
  • FAT領域のサイズやルートディレクトリのサイズ、そしてたくさんのアライン用リザーブがあるため、容量的には効率がよくない。
    • 例えば1440KBのデバイスに対して、FAT16なら最大で1436KBをファイル領域に割り当てられるが、SF16だと1120KBしかファイル領域に割り当てられない(ディスク容量に関わらず常に320KBを管理領域に要する)。

SF16 のドライバの例

  • (例えばリアルモード用の簡易なやつ、しかもクラスタサイズ32KB限定で、1GB以降にはアクセスしない簡易仕様)
  • 4KB単位でデバイスを読み書きするような汎用的なドライバを作る
    • FDの場合はさらに下請けで1KB単位で読み書きするやつを作って、4KBで依頼された仕事を4回の呼び出しに単純分割してやるとかすると楽そうだな。
    • こういう風にしておけばMOやCD-ROMなどでかいセクタのデバイスも同じように扱えて便利。
    • SF16だけを前提にしているうちは、絶対にアクセスは4KB単位(というか本当は32KB)で、話はとても単純になる。
  • そのドライバで最初の4KBをバッファに読み、次の部分を確認(ここでいう「最初」はHDDとかの場合はパーティションの最初という意味)
    • +0x40-+0x43の4バイトが 0x53 0x46 0x31 0x36 であることをチェック(シグネチャ:"SF16")。
    • +0x0dの1バイトが0x40であることをチェック(SF16_40)。
    • 一致しなかったらこのフォーマットは分かりませんでしたエラーを出す。
  • FATの部分のうちの最初の64KBを読み込む
  • ルートディレクトリ32KBも読み込む
  • 後は0x8000以降のFATにアクセスしようとしたら、未サポートエラーにでもしておく
    • こうすればリアルモードでもかなり簡単にFATをたどれる。
    • 1GBしか読み書きできないが、これだけの手間でここまでできてしまうのは非常にらくだと思う。もうちょっとがんばりたくなったときに2GBに対応すればいい(それでもFATのバッファを2倍にしてFATをたどるときにちょっと頑張るだけでいい)。
  • この例ではセクタサイズも32KB固定なので、クラスタ番号からセクタ番号等に変換するルーチンもものすごく単純
    • ここを可変にするとそれだけですぐにSF16_01~SF16_40の全てに対応できることになる。
  • ということでOSASKでのサポートもやろうとおもえばすぐできちゃう(OSASKは32bitなので、より一層楽)

おまけ FAT16 vs FAT12

  • FAT12はFAT16に対して以下の点で優れている
    • FAT用領域が25%削減できる。
  • FAT12はFAT16に対して以下の点で劣っている
    • アクセスがめんどう。
    • 4096クラスタ以上が扱えない。
  • Kが簡易柔軟フォーマットの提案に際してFAT12を廃し、FAT16ベースのみにした理由
    • 4096クラスタ制限は可変長ディスクイメージの実現にはあまりに大きな障害。
    • FAT12とFAT16のサポートをするくらいなら、FAT16のみにしてしまったほうが楽(判別する手間もなくなるし)。
    • 仮にちょうど4096クラスタの場合で、FAT16からFAT12に変更したとしても、容量は4KBしか得をしない。
      • SF16ではクラスタ位置のアラインなどが当然のように行われているため、4KBの差はただのリザーブ領域の増加を招くだけに過ぎない。
      • リザーブをわずか4KB増やすだけのために、FAT12とFAT16の判別と、FAT12の処理の複雑さを受け入れることは、合理的ではないと判断。

対応状況

凡例

Win対策しないでも正しく認識 (もちろんWin対策してもOK)
Win対策したものが正常動作
Win対策したら動作しないが、クラスタサイズを小さくしてWin対策を回避すると正常動作
×何をやっても誤動作

OS

OSATA-HDDPCカードUSB備考
Windows 95 OSR2.0◎ではないことも確認済み
Windows 98◎ではないことも確認済み
Windows 98SE
Windows ME
Windows XP◎ではないことも確認済み
  • PCカードというのは、PCカード接続のカードメモリ(PCカードATA系デバイス)。
  • 空欄は、試してないけどたぶんOK。
  • ここにあがってない他のデバイスはためしてないけど多分駄目。

  • 検証方法(他の方法でもよいが、確実な方法の例):

    [事前準備]

    • OSASKのおすすめ版をダウンロードして、
      prompt>imgtol e osaimgat.bin fdimage0.bin 1440
    • とやって、FDIMAGE0.BINという1440KBのファイルを用意しておく。
    • 128MB未満のメディアに対してDOSなどで(DOSプロンプトは不可)、pcctolのfコマンドでSF16_40.EIIを書き込む。これでメディアはSF16フォーマット(Win対策あり)になる。
      prompt>pcctol f 20 sf16_40.eii    (NOT DOS-PROMPT!!)

      [実験 (実験したいOS上でやる)]

      • 実験したいOS上で、このメディアのプロパティをみて、総容量が1.99GBで、かつ空き容量がメディアの本当の容量程度になっていることを確認。
        • これで総容量が1.99GBではなく、正しく表示されていればそれはSF16完全対応OSだろう。
        • この時点で空き容量がおかしければ、以下を試すまでもなく認識失敗。
      • このメディアに対して、実験したいOS上で、先ほどのFDIMAGE0.BINを書き込む。

        [確認 (OSASK上でやる)]

        • そして今度はOSASKを起動し、このメディアをPCカード接続(もしくはATA接続)で、OSASKから認識させてみる。
        • これで正しく認識できれば、先の書き込みテストはうまくいっていたことになる。書き込みテストでうまくいけば、読めるのは確実なので、テストする必要はない。
        • OSASKを使わずに、試したいOS上で読み書きできればそれでOKなんじゃないかと思うかもしれないが、誤認したまま誤認した方法で読み書きできちゃったりすることもあるので、やはり書き込ませた内容を、確実にSF16を解釈できるOSで(たとえばOSASKで)、認識させてみる必要があるだろう。

          [補足]

          • [実験]は該当OS上でやる必要があるが、[事前準備]と[確認]は違うPCの違うOS上でやってかまわない。

デジタルカメラ

メーカ機種名対応備考
CanonPowerShot A200◎ではないことも確認済み
FUJIFILMDS-20
KODAKDC4800クラスタサイズが小さいとだめらしい(sf16_01では×)
OLYMPUSC-200ZOOM×
RICOHCaplio RR30
TOSHIBAAllegretto M70

PDAなど

メーカ機種名対応備考
SONYPEG-N600C

こめんと欄

  • FAT12ってそんなに扱いにくいかなあ? そりゃFAT16の方が楽ですけど。 -- I.Tak.? 2003-10-06 (月) 10:31:38
  • とりあえず僕の見解を「FAT12 vs FAT16」に書いておきました。 -- K 2003-10-06 (月) 11:54:20
  • FAT12/FAT16のスレッショルドは4096クラスタじゃないですよ;-) -- 揚げ足えな? 2003-10-08 (水) 10:20:31
  • 000や001やff7以降が使えないから差し引いてね、っていう意味でしょうか。ええとそれなら分かっていて書いています。・・・いやその細かいことを書くのはどうかなと思って、あえて分かりやすい間違った数字を書きました。 -- K 2003-10-08 (水) 11:48:40
  • OSASKスレPart6だすYO! の309さんのレポートのおかげで、動作確認一覧が急速に充実しました。心からお礼申し上げます。SF16の育ての親といえるかもしれません。 -- K 2003-10-22 (水) 01:12:48
  • Win95OSR2.0では、FDをSF16フォーマットした後、一度ドライブから取り出して、再度ドライブ入れて読み出せば、ちゃんと認識できる(もちろんWin対策は必要)。今までできないと思っていたのでとてもびっくり!。うれしい。ちょっとだけWIn95を見直した。 -- K 2003-12-28 (日) 15:21:14
  • 「 フォーマット」のところの拡張フラグについて追記。 -- K 2004-04-03 (土) 01:51:42
  • SF16でWin2000が落ちる問題を確認しました。CFは16MB、SF16_40でのフォーマットです。開くとフリーズするのでプロンプトからすばやくフォーマットしたところ、ファイルシステムはFATと認識されていなかったようです。しかし、突然認識できなくなったので先日他のPCで読み込んだ影響かもしれません。OSASKで起動すると、普通に使えました。btcfでの起動も可能です。フォーマット後も問題が発生したので、どうやらSF16の問題ではなくカードの故障のようです。 -- Zakky 2004-10-03 (日) 14:50:24

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-17 (水) 07:30:53 (1914d)