★【FAT32の制限〜2GBが上限?・・・】 の話 今回の 動作テストで 【劇場版 あれ】が生成した“録画データ一時ファイル”のサイズが 4GBを超えていた・・・件について。 『4GBを超えるファイルなんて、そんな馬鹿なことがあるか!。お前のWindows98は FAT64 か?。 だから お前は インチキなんだ。』 〜〜 と抗議のメールが届いた。   ※この人は 多分、アプリケーション用のメモリ空間=最大2GB・・という事と混同しているかも・・と思われる。    もし、中傷目的であれば、掲示板で同じ内容の投稿をしたであろうが、    掲示板を読む人々に そのように混同させようと狙ったのであろう。 最終的には、ご自分で試してみれば、インチキかどうか判明する。 ただし、Windows自体が不安定であれば、4GBの一時ファイルが生成される前に Windows もしくは【劇場版 あれ】がフリーズする 事も考えられる・・・。(仕方が無い。笑。)   初級〜中級者のために 一応 説明しておく。 ◆このテストの後で “田中式を中傷するMarcomサイト”を 訪問して(何度か)録画したのだが、  【24フレーム/秒 カラー 800×600】で録画したが、やはり “一時ファイル”のサイズが 4GBを超えていた。  ただし、“仕上がりファイル”に変換する時の 圧縮率 を控えめにすると、駄目であった。  つまり、録画データを 劇場版 あれ で“仕上がりファイル”に変換した結果 〜 のサイズが 2GBを超えると駄目であった。  この時 【劇場版 あれ】は フリーズしないが、【エラーメッセージ】を表示する。   ※Marcomサイトを 訪問した時の録画ビデオは、たった3分程度の録画でありながら 仕上がりサイズが400MBもあるので、    HPで公開するのは サイズ的に無理。    静止画像を数枚 サイトアップしてあるが、サーバーの負荷を考慮して GIFに圧縮してある。    【 〜 Last_Information/to_biginners.htm】を開くと閲覧できる。    “ビデオデータ仕上げ変換”の時 圧縮していないので、その後で静止画像を切り出す時に GIFに圧縮しても かなり鮮明である。 ◆【Windows98のリソースキット】に、↓ 次のように記述されています (534ページ)。 2GBを超えるサイズのファイルを作成するには、【Extended Size】という 新しいフラッグを使ってファイルを開かなければならない。 これ ↑ に類する記述は 【リソースキット】の数ヶ所に存在し、ディスクを 直接 読み書きする関数も Windows98用に用意されている。 『2GBを超えるサイズのファイルは作成できない』〜とは書かれていない。 ◆12ビットFAT の時代も、その【ディレクトリエントリ】の中で ファイルサイズ記録の項目に 32ビットが用意されており、 当たり前のように16ビット以上の認識サイズが 書き込めている。 そりゃそうです。 12ビット=2の12乗=4096 (4096個のクラスタを認識・管理できる。) もし、これが 【ファイルサイズの制限】であれば どうであろうか?。 当時は 1クラスタのサイズ=1KBである。 4096KB(4MB)がファイルサイズ上限であるとすれば、Dosの時代とは言え、実に不便な事になる。 ◆【劇場版 あれ】 の内部動作が、クラスタ接続情報だけを使って【一時ファイル】として処理しているのかも知れない。 一時ファイルとして処理するだけなら、クラスタ接続情報だけで処理できる〜と思う。   (一時ファイルをエクスプローラーでコピーすると駄目かも。) この辺のところは 私が勉強不足の点もあるし、忘れてしまった知識もあって うまく説明できない。   ※以下に説明する内容について、詳しく勉強したい方は、Dosのバージョン2 〜 3 の本を買って下さい。    それより後の解説書には ほとんど解説されていません。    ちなみに、Windows95初期版のDosは Dosバージョン7.0 です。Windows3.1ののDosは Dosバージョン5.0です。 ◆【クラスタ接続情報】=“クラスタとペアとなる FATエントリ”に書かれた 【次のクラスタの“クラスタ番号”】。  ※ FAT=File Allocation table。    (初級者のために、ここでは 便宜上 【FATテーブル】とも呼ぶことにする。)  ※1ビット=2進数1ケタ。1ケタの数値で2とおりの数値を認識する(0 か 1)。  ※4ビット=16進数1ケタ。1ケタの数値で16とおりの数値を認識する(0〜F。 0〜9、A、B、C、D、E、F)。  ※8ビット=16進数2ケタ。(4ビット×4ビット。即ち 16×16。)   8ビット=1バイト(1byte)。     人間がコンピュータを扱う時、この1バイトという単位が基本となる。     2の10乗=1024。     1024バイト=1Kバイト(1KB)。 1024KB=1MB。 1024MB=1GB。  ※32ビット=16進数8ケタ。   デバイスマネージャーで【リソースタブ】を見ると、8ケタで E3DFFFFF などと表示されるのは これ。 ◆ファイルを作成した時、【ディレクトリエントリ】という領域が作成される。 この中に、  HDD内での“ファイルの実体”が存在する最初のクラスタ(開始クラスタ)の【クラスタ番号】が記録される。 そして、そのクラスタ(ファイルの実体)を 読み込む時、OSは 【FATテーブル】の同じ番号の箇所(FATエントリ)も ついでに読みます。 つまり、4番クラスタを読む時、【FATテーブルの 4番エントリ】も 一緒に読むのです。 その【FATエントリ】に 何が書かれているか?〜〜というと、そのファイル実体の 次のクラスタの【クラスタ番号】が 記録されています。  (1クラスタのサイズ=4KB〜32KBだから、“次”が存在する。 どこかに“まとめて”記録されてはいない。) HDDやFDDでは、これを 延々と繰り返して たどる事によって、1つのファイル全体を読み込む〜という仕組みになっています。 だから、【クラスタ接続情報】と呼ぶのです。 これが 【File Allocation table】 の名前の由来です(略して FAT)。 旅館の台帳みたいなものです。 ファイルを作成する時は、“次に読み込む時”に上記の読み込みルールで読めるように OSが書き込むのです。   ※FAT は、 HDDの円盤上で最も信頼性の高い“外周”の部分に存在します。    フロッピーを持つ時に「角の部分を持て」と言われるのは、これが理由です。(静電気の問題。)    フロッピーは四角いですが、中の磁性体は円盤ですから。 フリーズした時など ディスク-ファイルの論理構成 を修復できる事が多い理由は、 この【FAT】が2本あって、2本が 常に ミラーリングされて記録されるからです。(ミラー = 鏡。) 【ディレクトリエントリ】の中には ファイルのサイズも記録されています。 また、“ファイル実体の 最後のクラスタ”と同じ番号の【FATエントリ】には 特有の数値が書き込まれます。  (最後のクラスタの特有の数値 = FFFFFFFF 。 FAT16 では FFFF。 FAT32 ではたしか FFFFFFFF。) これらを突き比べて 論理構成 を高い確率で修復できる訳です。 ファイル作成時・更新時に ファイルサイズは最後に記録されます。  (アプリケーションの種別/動作状況によっては 【一時ファイルのサイズ=0バイト】と表示されているのを   体験したことがあるでしょう。) FAT32 の場合は 【FATエントリの数】が32ビットで認識され、その上限の理論値=2の32乗(16進数8ケタ)。  (実際には “クラスタのアドレッシング”は 28ビットで処理されている。)  ※ Windows95初期版などで、FAT16で 2GBのHDDをフォーマットした時、1クラスタのサイズ=32KB となる理由は、   2GB=2×1024×1024KB・・これを 16ビット最大認識数値(65536 : 16進数4ケタ)で割ると、1クラスタ=32KB。   FAT16で 【1パーティーション】のサイズの上限=2GB となる制限も、これが理由です。  ※ FAT16 の前の規格は FAT12。    (FAT12の当時は FAT12という呼称ではなく、単にFATと呼んでいた。      SCSI-2規格が登場してから それまでのSCSI規格をSCSI-1と呼ぶようになったのと同じ。) ◆FAT32 の場合は、割る方の数値の上限値が 32ビット(65536×65536 : 16進数8ケタ)。  つまり、  【FATエントリの数】として その最大認識数値に“32ビット”を使って ファイルシステムを管理する・・・という事。  これが 【FAT32】のネーミングの由来でもあり、制限でもあり、根本原理でもある。  即ち、原理的には HDD内のクラスタの個数として 最大で 65536×65536個 を認識(処理)できる・・・という事。 さて、 クラスタ接続情報だけを使って“一時ファイル”が生成されているとすれば、 “FATエントリ”の 【次のクラスタの クラスタ番号】 を 32ビット(28ビット)で認識できれば良いことになる。 仮に、HDDの 1クラスタのサイズ=4KBでフォーマット(標準値)されているとすれば、 【28ビットで認識可能なクラスタ番号】=2の28乗。・・・ 即ち 268435456 である。  ↑ 1クラスタのサイズ=4KBと仮定して 別の表現をすれば、    【4GBのファイルの クラスタ数】を認識(処理)するために必要な ビット数 = 20ビット。    ※4GB=4×1024×1024KB・・・これを 4KBずつで割算すると、1024×1024個 ← 即ち 20ビット(1048576個)である。 HPで公開した【動作テスト】を行なった時は Cドライブの 1クラスタのサイズ=16KB である。  ※【動作テスト】を公開する1年も前から HPのサブページで、   『Cドライブのフォーマットは 1クラスタのサイズ=16KB〜32KB』が望ましい・・と 書いていたのを読んだ方も多いハズ。 では、 4GB=4×1024×1024KB・・・これを 16KBずつで割算すると クラスタ数は 何個であろうか?。 4×1024×1024KB ÷ 16KB = 262144 個である。 262144 個 という数値を認識するのに必要な“ビット数”は 18ビット である。(32ビットの範囲内。) ◆つまり、 ファイルを 【一時ファイル】として クラスタ接続情報でたどって 順番に処理するだけなら、  【FAT32】でも処理できる・・・という事になる。    ※ファイル全体を読み込んで 1個のファイルとしてメモリ空間でまとめて処理しなければ良い。     例えば、エクスプローラーで コピーしようとすると サイズ認識の点でも 制限に引っ掛かるのかも・・。 ◆【参考】  拡張カードで【Rom-BIOS】を保有するカードの場合は、  PC起動時に 【Rom-BIOS】専用の領域が メモリ空間に確保される。  そして、この領域は 必ず 下位から1024KB(1MB)までのメモリ空間(物理メモリ空間)に確保される。  1024KBのメモリ空間は 20ビット(16進数5ケタ)で表現できる。  デバイスマネージャーの【リソースタブ】で、16進数下位5ケタより上(左側3ケタ)が 000 となっているアドレスは  PC起動時に確保されたメモリ空間である。そうでないアドレスは Windowsが【仮想アドレス】として動的に管理するメモリ空間。