最近、バイナリファイルの破損の理由を調査しています。具体的には、Androidアプリ、ネイティブ部分はSDカード上のバイナリファイルの読み取り/書き込みが可能です。不明な理由でバイナリファイルが破損することがあります。これらのファイルの一部をさまざまなユーザーから収集しました。 、そしていくつかの興味深い事実を見つけました。
破損の大部分の種類の1つは、バイナリファイルの最初の4096バイトが消去されることです。これらのファイルを16進ダンプすると、最初の4096バイトはすべてゼロになります。 4096以下または4096未満ですが、正確には4096バイトです。これは偶然ではないと思います。 4096バイトは1ページサイズです。しかし、経験が不足しているため、理由がわかりません。さらに重要なことに、他のユーザーやデバイスでそのようなことを回避する方法がわかりません。
それに加えて、いくつかのバイナリファイルの途中に、いくつかの連続したゼロセグメントもありますが、そこにあるべきではありません。それが私たちのプログラムのバグではない場合、プラットフォーム/デバイスカーネル、またはデバイスのような他の何かが突然電源を切ったことに関連する可能性のある理由はありますか?
同様の状況を経験した人が、ヒント/アドバイス/解決策などを教えてくれることを願っています。これは本当に私を混乱させました。
どうもありがとう〜
私は、バイナリを破壊するいくつかの組み込みアプリケーションでいくつかの同様の経験を持っています。まず、ファイル処理を再確認します(特にマルチスレッド環境で)。完全に実行したと思います。次に、すべての書き込みを同期してみます。 Linuxカーネルは、アプリに書き込みを指示しても書き込みを行いませんが、ディスクにフラッシュする前にデータをバッファリングします。
http://linux.die.net/man/2/sync
お役に立てれば。
私の経験では通常問題となるファイル処理を確認してください
壊れたファイル、または壊れたファイルシステムでさえ、「4096バイトのファイル」によって奇妙に引き起こされます。
この破損は、ページサイズと等しいext4ファイルシステムのクラスターサイズが原因です。
現時点では、ブロックのデフォルトサイズは4KiBです。これは、ほとんどのMMU対応ハードウェアで一般的にサポートされているページサイズです。ブロックサイズがページサイズを超える場合を処理するためにext4コードが準備されていないため、これは幸運です。
PS
LinuxベースのOS(Androidを含むがこれに限定されない)のデフォルトのファイルシステムであるext4を使用しています
4KiBファイルが危険である理由について説明します。理由は簡単に理解できます。
あなたはここでもっと読み続けることができます: