問題タブ [fat16]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - FAT, optimize performance when retrieve a file
I have an implementation of database with one file per record, and I have about 10000 records. I'm trying to optimize the performance of access to file, and I have a little doubt.
Is split files into folders better then keep all in single folder, for quick access to the files? ex: from 0 to 999 in folder 0, from 1000 to 1999 in 2 etc...
What is better for this, FAT16 or FAT32?
microcontroller - FAT16ディレクトリ
リソースに制約のあるマイクロコントローラーでFAT16ファイルシステム構造を使用する低レベルのアプリケーションに取り組んでいるため、独自のカスタムアクセスコードを作成する必要があります。私はすでにPetitFATやFatFSのようなライブラリの使用を検討しましたが、残念ながら、これらのどちらも私のニーズに合うとは思いません。ただし、これらはFATがどのように機能するかについての有用なリファレンスとして役立ちました。
私がまだ問題を抱えている領域の1つは、サブディレクトリエントリです。
これによると、ディレクトリエントリは1つの開始クラスタを指すことができます。データファイルの場合、これは単に最初のデータクラスターです。ディレクトリの場合、これはサブディレクトリ(おそらく別のディレクトリエントリ)の開始クラスタです。
これは、ルートディレクトリからベースファイルまでのディレクトリパスが1つしかない場合は問題なく機能しますが、特定のディレクトリの下にある複数のファイル/ディレクトリに分岐する方法がわかりません。
元。ディレクトリ構造:
FAT16の構造についての私の理解に基づいて、
FATの直後には、の情報を含む最初のルートディレクトリエントリのクラスタがありますroot dir 1
。最初のクラスターフィールドには、のクラスターアドレスが含まれます。sub dir 1
最初のクラスターフィールドには、のクラスターアドレスが含まれ、file 1
最初のクラスターはデータクラスターを指します。
2番目のルートディレクトリエントリは、2番目のクラスタで開始され、その後、の情報を含むFATが終了しroot dir 2
ます。その最初のクラスターはのクラスターを指し、sub dir 3
最初のクラスターは空のクラスターを指します(FATでマークされているように)。
ここで何が欠けていますか?ルートディレクトリエントリからに移動する方法がわかりませんsub dir 2
。
filesystems - FATディレクトリ、ファイルをトラバースする方法
FATファイルシステムがどのように機能するかを理解しようとしています。添付されているFAT16パーティションの最初のセクターから、私は理解できました。
- セクターあたりのバイト数=512。
- クラスターあたりのセクター=4。
- FAT16ファイルシステム。
- 予約セクター=4。
- FATテーブル数=2。
- ルートディレクトリのエントリ数=512。
- 総セクター=204800。
- ルートディレクトリセクター=32。
- FATテーブルのサイズ=200。
- 最初のデータセクター=436(4 + 2 * 200 + 32)。
- クラスター数=51091。
ルートディレクトリは404番目のセクター(0x32800番目のバイト)にあります
アドレス0x32800のルートディレクトリが接続されています。ルートディレクトリには、a、bという名前の2つのフォルダと、file.txtという名前の1つのファイルがあります。上記の画像では、ファイルとフォルダを区別する方法が示されています。
以下にリストされている疑問:1。フォルダエントリは0x2Eで始まる必要がありますが、そのような値はありません。では、特定のエントリがファイルなのかフォルダなのかを確認するにはどうすればよいでしょうか。2.ご覧のとおり、ルートディレクトリの各エントリは(32バイトではなく)64バイトを占めています。ファイルとフォルダごとに2つの32バイトエントリがあるようです。たとえば、フォルダ'a'には0x32800と0x32820(合計64バイト)のエントリがあります。3.このコンテキストで値0x41は何を意味しますか?値0x41は、0x32800、0x32820、0x32840、0x32880に表示されます。0x32860および0x328A0の値は、0x41とは異なります。4.アドレス0x32800(0x32800 + 0x1a = 0x3281a)からのオフセット0x1Aの値は0、アドレス0x32820(0x32820 + 0x1a = 0x3283a)からのオフセット0x1Aの値は3です。フォルダー'a'に対応する正しいクラスター番号はどれですか。
filesystems - fat16でディレクトリとファイルエントリを区別する方法は?
fat16 システムの場合、サブディレクトリとファイルの区別について非常に混乱しています。サブディレクトリとファイルは構造が似ているため、ディレクトリとファイルをどのように区別し、どのようにディレクトリをたどってファイルにたどり着くのでしょうか?
最初は、fat16 の 8.3 命名規則の 1 バイト目として、すべてのディレクトリ エントリが '0x2e' で始まると考えていました。しかし、実際には、0x2e で始まるすべてのディレクトリを見つけることはできませんでしたが、ディレクトリの名前を直接見つけることができませんでした。では、fat16 でディレクトリとファイルを区別するにはどうすればよいですか?
filesystems - FAT16 を理解する
FAT16
ファイルシステムを備えたフラッシュベースの USB 大容量記憶装置を開発しています。正常に動作していますが、FAT セグメントで何が起こっているのか理解できません。
開始すると、ルート ディレクトリに 56 バイトの長さの 1 つのファイルがあり、長さは 32 ビットで、データは 2 番目のクラスターに格納されます (0 と 1 は FAT では使用できません)。
FAT セグメントのメモリ ダンプを見ると、次のように表示されます。
私が理解しているように、最後の 0xFFFF は、このクラスターがこのファイルのチェーン内の最後のクラスターであることを意味します。
ここまでは順調ですね。
しかし...実際のファイルのサイズを 4,032 バイトに拡張すると、FAT セグメントは次のようになります。
ここで何が起こっているのか誰でも説明できますか?
説明できないことがいくつかあります。
1. 4 つのシステム予約バイトが変更されるのはなぜですか?
2. 0xFFFF が表示されません。これは、クラスター チェーンに終わりがないことを意味しますか?
ブロックサイズは512バイトで、ファイルシステムはクラスターごとに2セグメントでフォーマットされています。
c++ - ファイルをfat16ファイルシステムに書き込む
それで、私は最近、オンラインで見つけたこのコードを適応させました。これは、ファイルを FAT16 ファイル システムにコピーし、それを「regular;」に配置するコマンド ライン ツールです。ディレクトリ:
ここでやりたいことは、通常のディレクトリからファイルを取得してコピーし、そのコピーを FAT16 に入れるコマンドを作成することです。誰かがそれがどのように行われるかについて考えを持っていますか?
file - FAT16 ファイル システムの読み取り
FAT16 ファイル システムを読み取って、セクター数、クラスター数、バイトパーセクター数などの情報を取得しようとしています...
私はこのようにそれを読もうとしています:
そして、これを出力します:
これらの数字は何を表し、どのタイプですか? バイト?
python - 特定のファイルのキャッシュ/バッファを無効にする (Linux)
現在、Yocto Linux ビルドで作業しており、FPGA 上のハードウェア ブロックとインターフェイスしようとしています。このブロックは、FAT16 ファイル システムを搭載した SD カードを模倣しています。単一のファイル (cam.raw) を含みます。このファイルは、FPGA と Linux システム間の共有メモリ空間を表します。そのため、Linux システムからこのメモリにデータを書き込んで、FPGA が行った変更を元に戻すことができるようにしたいと考えています (現在、FPGA は単にメモリ空間からデータの一部を取得し、メモリ空間の LSB に 6 を追加します)。 0x40302010 を書き込み、データを読み戻すと 0x40302016 が返されるように、32 ビット ワード)。ただし、どこかにキャッシングがあるため、FPGA にデータを書き込むことはできますが、すぐに結果を返すことはできません。
私は現在、このようなことをしています(簡単なのでpythonを使用しています):
データが変更されたことを dd で確認できます (ただし、バッファリングの問題も頻繁に発生します)。FPGA のツール (SignalTap/ChipScope) を使用すると、実際に正しい答えが得られます (つまり、最初の 32 ビット ワード)。この場合は 0x03020106 です)。ただし、誰かが、そのpythonまたはlinuxまたはその両方がファイルをバッファリングしており、「SDカード」(FPGA)から再度読み取らず、ファイルデータをメモリに保存していません。これを完全に遮断して、すべての読み取りが FPGA からの読み取りになるようにする必要があります。しかし、バッファリングがどこで行われているか、またはその方法がわかりません。
どんな洞察もいただければ幸いです!(注意、mmap.flush() を使用して Python から書き込んだデータを取得して FPGA にダンプできますが、ファイル データを mmap に再読み込みするには、リバース フラッシュまたは何かが必要です!)
アップデート:
コメントで示唆されているように、必要なものを実装するには mmap アプローチが最適ではない可能性があります。ただし、Python と C の両方で試してみましたが、O_DIRECT フラグを使用して基本的な I/O 関数 (Python では os.read/write、C では read/write) を使用しました。これらの操作のほとんどで、最終的に errno 22 が発生します。これについてはまだ調査中です....