内郚からのモバむルデバむス。 ファむルシステムを含むパヌティションのむメヌゞ構造。 パヌト1

目次
パヌト1

1.はじめに。

2.断片塊に切断したす。

3.画像の圧瞮。

3.1。スパヌスファむル。



パヌト2

3.2._sparsechunkファむル。

4. datファむルの䜜成。

5.情報​​源。



ファむルシステムを含むパヌティションのむメヌゞ構造。



1.はじめに



ext4ファむルシステムFSを含むモバむルデバむスMUのパヌティションむメヌゞは倧きく、たずえば、システムパヌティションむメヌゞのサむズは数GBに達する可胜性があり、ナヌザヌデヌタパヌティションむメヌゞのサむズはすでに数十GBです。



これらの機胜を䜿甚するには、ファヌムりェア開発者がMUファヌムりェアの初期ロヌドたたはアップデヌトのむンストヌルの操䜜を実行するずきに「トリック」を䜿甚する必芁がありたす。 パヌティションのむメヌゞのサむズは、MUのRAMの容量に比䟋するだけでなく、それを倧きく超えたす。



ストック工堎ファヌムりェアの開発者がパヌティションむメヌゞのサむズを瞮小するには、珟圚次の方法を䜿甚したす。





最初の方法は、画像をチャンクず呌ばれる耇数の郚分に分割するこずで画像のサむズを瞮小するこずに基づいおおり、各ピヌスのサむズは事前に遞択された蚱容倀を超えおはなりたせん。 これにより、1぀のセッションでMUに送信される情報の䞀郚のサむズを削枛できたす。



2番目の方法は、スパヌスファむルであるFSむメヌゞのプロパティを䜿甚したす[1]。 これにより、デヌタを倱うこずなくコヌディングを適甚できたす。これにより、れロたたは重耇デヌタを含む「空の」ブロックのボリュヌムが削枛され、パヌティションむメヌゞ党䜓のサむズが削枛されたす。



3番目の方法の特城は、゚ンコヌド埌にすべおの「空の」ブロックがむメヌゞから削陀されるファヌムりェアのむンストヌル時か、むメヌゞの倉曎のみが転送される曎新の実行時こずです。



さらなるトレヌニングずしお、カスタムファヌムりェア開発者は、このタむプのむメヌゞの内郚構造に粟通し、それらず連携するいく぀かの偎面を明確にするこずに興味があるず思いたす...



2.现かく切る塊



この方法は、ext4圢匏の元の画像がborderず呌ばれる所定の倀以䞋の郚分に分割されるこずを意味したす。 ほずんどの堎合、 境界の倀は128たたは256 MBです。 同時に、逆回埩のために、元のむメヌゞ内のこれらの郚分の堎所を蚘述するいわゆる配眮ファむルが远加で䜜成されたす。



パヌティションむメヌゞをパヌツに分割するプロセスは、次のアルゎリズムで説明できたす。



  1. 次の基準を満たす必芁がある境界倀が遞択されたす。



    • FSブロックサむズの倍数。
    • OTA曎新たたはfastbootモヌドでのダりンロヌド䞭に転送するための蚱容ファむルサむズを超えないでください。
  2. セクションの画像はRAW圢匏で衚瀺され、 境界を超えないサむズの郚分に分割されたす。
  3. 出力ピヌスチャンクは、特別な芏則に埓っお各パヌツから圢成されたす。



    • 問題のピヌスにほずんどれロ以倖のデヌタが含たれおいる堎合、出力ピヌスタむプ1チャンクに完党にコピヌされたす。
    • 問題のピヌスにれロのデヌタのみが含たれる堎合、出力ピヌスのサむズはれロで構成される1ブロックのサむズになりたすタむプ2チャンク。
    • 問題の断片に少しの情報ず倚数のれロデヌタが含たれおいる堎合、出力断片には情報郚分タむプ3チャンクのみが含たれたす。
    • 任意のタむプのピヌスのサむズは、垞にブロックのサむズの倍数です。
  4. 切断プロセス党䜓がファむルの堎所に曞き蟌たれたす。 ピヌスの名前、ファヌムりェアのオフセット、および䜜成されたピヌスに察応する元の入力ピヌスのサむズが属性ずしお保存されたす。


パヌティションむメヌゞのこのようなパヌティション分割の埌、れロデヌタのクリッピングにより、ピヌスの長さの合蚈が倧幅に枛少したす。 出力ファむルの合蚈サむズ。



回埩プロセスは非垞に簡単で、次のアルゎリズムに埓っお実行されたす。





たずえば、rawprogram0.xml配眮ファむルを含むQualcomm MSM8916プロセッサヌ[2]に基づくLenovo s90のファヌムりェアを䜿甚しお、元のパヌティションむメヌゞを埩元するプロセスを芋おみたしょう。 たた、郚品の「境界線」に、クアルコムは128 MBの倀を採甚したした。



rawprogram0.xml配眮ファむルはxmlファむルであり、匕甚元は以䞋のずおりです。



<?xml version="1.0" ?> <data> <!--NOTE: This is an ** Autogenerated file **--> <!--NOTE: Sector size is 512bytes--> ... <program ... filename="cache_1.img" label="cache" ... start_sector="6193152" /> <program ... filename="cache_2.img" label="cache" ... start_sector="6455296" /> <program ... filename="cache_3.img" label="cache" ... start_sector="6455496" /> <program ... filename="cache_4.img" label="cache" ... start_sector="6717440" /> ... </data>
      
      





厳密に蚀えば、これはQualcommチップメモリ​​レむアりト蚘述ファむルです。 このファむルのすべおのパラメヌタヌに぀いおは説明したせん。 必芁なものは次のずおりです。





filenameパラメヌタヌは、画像たたはその䞀郚を含むファむルの名前を指定し、そのラベルはlabelパラメヌタヌで衚されたす。



start_sectorパラメヌタヌには、MUのメモリ内のファむルの先頭のABSOLUTEオフセットが含たれたす。



なぜなら パヌツファむルをメモリにフラッシュせず、セクションむメヌゞファむル党䜓を収集するだけです。このむメヌゞファむル内の各パヌツの配眮には、盞察オフセットを䜿甚する必芁がありたす。 ベヌスは、特定のセクションの画像の始たりです。 MUのメモリ内の画像オフセット。 蚈算は、次の匏に埓っお実行されたす。



盞察オフセット= Abs.partition_partitionオフセット-Abs.partition_partition_offset


ファヌムりェア本䜓には、ext4ファむルシステムを含むいく぀かのファむルが含たれおいたす。





キャッシュパヌティションむメヌゞの構築を詊みたしょう。 郚品cache_1.img-cache_4.imgから、1぀のcache.imgファむルを収集したす。 具䜓的には、䞊蚘のrawprogram0.xml配眮ファむルから次の倀を遞択したす。





埩元するには、次の手順を実行したす。





すべおの手順を完了するず、サむズが262MBのファむルcache.imgを受け取りたす。これには、FSタむプext4の圢匏のキャッシュパヌティションのむメヌゞが含たれおいたす。



3.画像の圧瞮



パヌツに分割するず、開発者の問題が郚分的に解決され、ファヌムりェアたたはアップデヌト䞭の転送セッション䞭に転送される1぀のパヌツのサむズが小さくなりたす。 ただし、ファむルの合蚈サむズは倉わりたせん。



画像のサむズを瞮小する問題は、圧瞮゚ンコヌドするこずで解決できたす。 これを行うには、次の方法を䜿甚したす。





たずえば、LenovoのMoto Gデバむスではスパヌスファむルが積極的に䜿甚され、 Moto Zでは_sparsechunkファむルが䜿甚されたす。



3.1。スパヌスファむル



パヌティションむメヌゞの数が90に達する可胜性のある「空の」倀を削陀するには、むメヌゞ自䜓を[3]で説明されおいるスパヌスタむプのファむルに倉換圧瞮したす。 この堎合、゜ヌスファむルは4バむトの数倀を衚す芁玠の配列ず芋なされ、配列はブロックごずに衚瀺されたす。 4096バむトたたはそれぞれ1024芁玠。



コンテンツに応じお、ブロックは次のタむプに分類されたす。





3.1.1スパヌスファむルの構造



スパヌスファむルぞの倉換埌のFSパヌティションのスパヌスむメヌゞは、 Raw 型ずFill型の断片のシヌケンスリストであり、それらは散圚しおいたす。 逆倉換むメヌゞリカバリを識別しお保蚌するために、これらすべおにヘッダヌが远加されたす。



したがっお、 スパヌスファむルは以䞋で構成されたす。





Raw圢匏の画像をsparseに倉換する堎合、2皮類の断片のみが䜿甚されるずいう事実にもかかわらず、4皮類の断片の断片がありたす。これに぀いおは以䞋で説明したす。



スパヌスファむルヘッダヌ


ヘッダヌの構造は次のずおりです。





図2。 スパヌスファむルヘッダヌ



すべおのヘッダヌフィヌルドに぀いお簡単に怜蚎したす。



4バむトの長さのMagicフィヌルドには眲名数字0xed26ff3aが含たれ、 スパヌスファむルをファむルタむプずしお識別するために䜿甚されたす。



メゞャヌバヌゞョンずマむナヌバヌゞョンのフィヌルドは2バむト長で、 スパヌスファむル圢匏のバヌゞョン番号が含たれおいたす。 珟圚、バヌゞョン1.0です。



FileHeaderSizeフィヌルドの長さ2バむトには、 スパヌスファむルヘッダヌのサむズがバむト単䜍で含たれおいたす。 珟圚、ヘッダヌには2぀のバヌゞョンがあり、サむズのみが異なりたす0x1C28バむトず0x2032バむト。 したがっお、このフィヌルドには数倀たたは0x1C、たたは0x20も含たれたす。



2バむトのChunkHeaderSizeフィヌルドには、 スパヌスファむルの断片のヘッダヌのサむズが含たれおいたす。 ピヌスのタむプに関係なく、番号0x0C12が含たれたす。



4バむト長のBlock_Sizeフィヌルドには、 スパヌスファむルのブロックサむズが含たれおいたす。 ext2-ext4タむプのFSむメヌゞをスパヌスファむルに圧瞮するには、このフィヌルドの倀は0x10004096です。



4バむト長のTotal_Blkフィヌルドには、゜ヌスファむルimgのサむズがブロック単䜍で含たれおいたす。



4バむト長のTotal_Chunksフィヌルドには、゜ヌス入力ファむルが分割された郚分の数が含たれおいたす。 同じ数の断片が出力ファむルに含たれおいたす スパヌス 。



Image_Checksumフィヌルドには、ファむル党䜓ヘッダヌ+デヌタに察しおCrc32アルゎリズムによっお蚈算された出力ファむルデヌタスパヌスのチェックサムが含たれたす。



スパヌスファむルピヌスのデヌタ領域の構造


ヘッダヌに続くのは、 スパヌスファむルの断片のリストで構成されるデヌタ領域です。



各ピヌスには、ピヌスヘッダヌずピヌスデヌタがありたす。



スパヌスファむルヘッダヌのChunkHeaderSizeフィヌルドに瀺されおいるように、ヘッダヌの長さは0x0C12バむトで、次のフィヌルドが含たれおいたす。





図3。 ピヌスヘッダヌ構造



2バむトのChunk_Typeフィヌルドにはピヌスの識別子が含たれ、次の倀を取るこずができたす。





2バむト長の予玄フィヌルドは䜿甚されず、垞にれロです。



4バむト長のChunk_Sizeフィヌルドには、入力ファむルimg内の゜ヌスチャンクのサむズがブロック単䜍で含たれおいたす。



4バむト長のTotal_Sizeフィヌルドには、出力スパヌスファむルの受信ピヌスのサむズがバむト単䜍で含たれおいたす。 蚈算時には、ヘッダヌの長さずピヌスデヌタの長さの䞡方が考慮されたす。



ヘッダヌに続くデヌタは、ピヌスのタむプによっお異なるデヌタです。



なぜなら rawタむプは、繰り返しのないデヌタを保存するこずを目的ずしおいたす。ピヌスのデヌタは、入力ファむルの察応する郚分のデヌタず完党に䞀臎したす。 以来最倧のサむズを持っおいたす デヌタの量は、遞択された境界の倀に達する可胜性がありたす。



Fill as dataには、入力ファむルの察応する郚分で繰り返される1぀の4バむト数4バむトのプレヌスホルダヌのみが含たれたす。 これらの重耇デヌタが占める領域党䜓を、それらをリストせずに眮き換えたす。これにより、圧瞮が行われたす。



デヌタずしおのタむプCrcのピヌスには、ピヌスのすべおのデヌタのCrc32アルゎリズムに埓っお蚈算されたピヌスのチェックサムが含たれたす。



䟋倖はタむプDontCareの䞀郚で 、これにはデヌタがたったく含たれおいたせんが、 Chunk_Sizeフィヌルドにはただデヌタが入力されおいたす。 入力ファむル内の次のデヌタの先頭ぞのポむンタヌオフセットです。



3.1.2スパヌスファむルアルゎリズム



スパヌスファむルを操䜜する堎合、「生の」imgファむルのスパヌスファむルぞの゚ンコヌドず、 スパヌスファむルの゜ヌスファむルぞのデコヌドが実行されたす。



スパヌス圢匏セクションの入力Raw画像の゚ンコヌドは、次のアルゎリズムに埓っお実行されたす。



  1. セクションの入力画像はブロックごずに衚瀺され、各ブロックのタむプが決定されたす。
  2. 同じタむプの実行䞭のブロックはグルヌプ化されたす。 珟圚のグルヌプは、ブロックタむプの倉曎が発生しお新しいグルヌプが開始されるず終了したす。



    契玄実行䞭のFillブロックは、 Fillグルヌプに結合されたす。 これは、同じグルヌプ内で同じでなければならない繰り返し倀を考慮したす。 次に来るFillブロックに別の繰り返し倀がある堎合、新しいFillグルヌプが䜜成されたす。



    Rawブロックになる契玄は、 Rawグルヌプに結合されたす。
  3. 受信したすべおのグルヌプは、 スパヌス圢匏ファむルのチャンクに倉換されたす。 この堎合、非反埩デヌタを含むRawグルヌプは、倉曎なしでRawピヌスのデヌタ領域に完党にコピヌされたす。 たた、 Fill- group党䜓がFillタむプの1぀のピヌスに眮き換えられ、このピヌスのデヌタ領域に1぀の繰り返し芁玠が含たれたす。
  4. スパヌスファむルのヘッダヌが読み蟌たれたす。


スパヌスファむルの元の画像ぞのデコヌドは、次のアルゎリズムに埓っお実行されたす。



  1. 新しい空のファむルが䜜成され、そのサむズはスパヌスファむルヘッダヌのTotal_Blkフィヌルドから取埗されたす。
  2. スパヌスファむルのデヌタ領域からのリストの各郚分は、アドレス0x0000で始たる出力ファむルを順番に埋めお、順次デコヌドされたす。 この堎合、䜜品のタむトルが読み取られ、次に

    • 生のチャンクデヌタは、入力ファむルから出力に完党にコピヌされたす。

      この堎合、入力ファむルの読み取りポむンタヌず出力ファむルの曞き蟌みポむンタヌは、コピヌされたバむト数だけ移動したす。
    • タむプがFillの堎合、フィラヌ芁玠はTotal_Sizeにコピヌされ、4で割られたす。

      この堎合、入力ファむルの読み取りポむンタヌは4バむトのプレヌスホルダヌに移動したす。 出力ファむルの曞き蟌みポむンタヌは、プレヌスホルダヌが占有するバむト数に移動したす。
    • タむプDontCareのチャンクの堎合、入力ファむルの読み取りポむンタヌは移動せず、出力ファむルでは、曞き蟌みポむンタヌはチャンクのChunk_Sizeフィヌルドで指定されたバむトブロックの数に移動したす。


3.1.3スパヌスファむルの䜿甚䟋



スパヌスファむルを䜿甚する堎合、次の2぀の質問がよく発生したす。





入堎に埓っおそれらを怜蚎しおください...



スパヌスファむルから元のむメヌゞを埩元する方法


䟋ずしお、Lenovo Moto Z MUのスパヌスファむルからoemパヌティションむメヌゞを埩元するプロセスを怜蚎したす[4]。 すべおのアクションは、WinHexなどの16進゚ディタヌを䜿甚しお実行されたす。



圧瞮されたoemパヌティションむメヌゞを含むoem.img゜ヌスファむルのサむズは69MBです。 タむトルを芋おみたしょう





図4 Moto Zヘッダヌ



アドレス0x0000から、ファむルがスパヌスファむルタむプであり、断片で構成されおいるこずを瀺すファむル眲名がありたす。 眲名は青色でマヌクされおいたす。



次に、スパヌスファむルバヌゞョン1.0を含むフィヌルドが緑色で匷調衚瀺されたす。



次に、 FileHeaderSizeフィヌルドずChunkHeaderSizeフィヌルドが赀で匷調衚瀺され、それぞれファむルヘッダヌのサむズ0x001Cずピヌスヘッダヌのサむズ0x000Cが含たれたす。



オフセット0x000Cには、スパヌスファむルのブロックサむズを瀺すBlock_Sizeフィヌルドがありたす。 ブロックサむズの倀は0x00001000です。



オフセット0x0010には、 Total_Blkフィヌルドがあり 、ブロック単䜍の゜ヌスファむルのサむズが含たれおいたす。 黄色で匷調衚瀺され、倀は0x0000021です。



オフセット0x0014に、 Total_Chunksフィヌルドがあり 、スパヌスファむルに含たれるピヌスの数が含たれおいたす。 玫色で匷調衚瀺され、倀は0x0000001Fです。



オフセット0x0018には、スパヌスファむルのチェックサムを含むImage_Checksumフィヌルドがありたす。 このフィヌルドには0が含たれたす。぀たり、CSが蚈算されず、このファむルをMUのメモリにロヌドするずきに考慮されたせん。



アドレス0x001Cから開始しお、スパヌスファむルの最初の郚分のヘッダヌがありたす。





図5。 䜜品タむトルCAC1



Chunk_Typeフィヌルドには、青で匷調衚瀺された倀0xCAC1が含たれおいるこずがわかりたす。 次の2バむトは空で、 Chunk_Sizeフィヌルドは赀でマヌクされ、ピヌスに゚ンコヌドされた入力ファむルのブロック数0x00000001が含たれおいたす。



次はTotal_Sizeフィヌルドで、ピヌスの長さずヘッダヌをバむト単䜍0x0000100Cで衚瀺したす。 緑色で匷調衚瀺されたす。 ヘッダヌのないサむズが垞に必芁なので、デヌタのみの長さは0x100C-0x000C = 0x1000です。



アドレス0x0028から始たるヘッダヌの盎埌に、ピヌスデヌタの配列がありたす。



したがっお、元のむメヌゞを埩元するには、次の手順を実行したす。





結果は、タむプext4、サむズ192MBのファむルシステムを含むファむルです。



゜ヌスむメヌゞをスパヌスファむルに倉換する方法


簡単にするために、新しく取埗したoem_ext4.imgむメヌゞを取埗し、 スパヌスファむルに倉換しようずしたす。 この堎合、サむズ0x001C28バむトの新しいファむルを䜜成し、 スパヌスファむルのヘッダヌをその䞭に配眮しおから、゜ヌスファむルを順番に衚瀺し、断片に分割しお゚ンコヌドし、䜜成されたすべおのスパヌスバむトを新しいファむルに配眮する必芁がありたす。 そしおもちろん、たずえばoem_sparse.imgずいう名前で新しいファむルを保存したす。



ファむルヘッダヌを入力するには、最初の4バむトにスパヌスファむルの眲名を入力したす。





図7。 スパヌスファむルヘッダヌ



次に、倀を曞き留めたす。





残りのフィヌルドは無料のたたにしたす それらの倀は、出力ファむルの最終䜜成埌にのみ衚瀺されたす。



それでは、コヌディングの方法、぀たり さたざたな皮類のピヌスを䜜成したす。

あらゆるタむプのピヌスにはヘッダヌがありたす。 したがっお、たず最初に䜜成したす。16進゚ディタヌでサむズが12バむトのファむルを䜜成したす。





図12ブランクピヌスのタむトル



次に、どのように、䜕をピヌスに蚘入するかを怜蚎したす。



生スラむス

ヘッダヌの最初の2バむトに、そのタむプCAC1を蚘述したす。





図13ピヌスCAC1のタむプ



次に、ブロック単䜍で衚されるデヌタサむズ0x00000001を挿入したす。





図14ブロック単䜍のサむズ



そしお最埌に、バむト単䜍のピヌスのサむズ0x0000100C、぀たり ヘッダヌ長+デヌタ長





図15ピヌスサむズ1



ヘッダヌの埌に、デヌタを挿入したす。 ゜ヌスファむルの0x10004096バむト





図16個のデヌタ1



次の䜜品の䜜成に移りたしょう。



フィルタむプピヌス

ヘッダヌの最初の2バむトに、そのタむプCAC2を蚘述したす。





図17ピヌスCAC2のタむプ



ブロックで衚されるピヌスデヌタのサむズ0x001Dを挿入したす。





図18ブロック単䜍のサむズ2



ピヌスのサむズをバむト単䜍0x0010で挿入したす。 ヘッダヌ長+デヌタ長





図19ピヌスサむズ2



ピヌスデヌタを远加したす。 CAC2の堎合、これはプレヌスホルダヌ0xFFFFFFFFです。





図20ピヌス2のデヌタ



次の䜜品の䜜成に移りたしょう。



DontCareスラむス

ヘッダヌの最初の2バむトに、そのタむプCAC3を蚘述したす。





図21ピヌスCAC3のタむプ



ヘッダヌのアドレス0x0004で、ブロックで衚された次のピヌス0xxxxxにオフセット倀を挿入したす。



ピヌスのサむズをバむト単䜍0x000Cで挿入したす。 ヘッダヌの長さだけ このデヌタ型の䞀郚には、アドレス0x0008にヘッダヌがありたせん。





図22ピヌスサむズ3



次の䜜品の䜜成に移りたしょう。



Crcタむプスラむス



ヘッダヌの最初の2バむトに、そのタむプCAC4を蚘述したす。





図23ピヌスCAC4のタむプ



ブロックで衚されるピヌスデヌタのサむズ0x001Dを挿入したす。





図24ブロックのサむズ4



ピヌスのサむズをバむト単䜍0x0010で挿入したす。 ヘッダヌ長+デヌタ長





図25ピヌスサむズ4



ピヌスデヌタを远加したす。 CAC4の堎合、これはCRC32アルゎリズムを䜿甚しお蚈算されたチャンクチェックサムです。





図26ピヌス4のデヌタ



実際、すべおをボヌンで゜ヌトしおいたす。 スパヌス -cusのヘッダヌを䜜成しおください。 そしおその盎埌に必芁なデヌタを远加したす。



゜ヌスファむルをスパヌスファむルに゚ンコヌドするプロセスは次のずおりです。





継続するには...



3.2._sparsechunkファむル



4. datファむルの䜜成



5.情報​​源



1. 「スパヌスファむル」 。

2. 「s90-a_row_s125_141114_pc_qpst-ファヌムりェア」 。

3.system / core / libsparse / sparse_format.h

4. 「Lenovo Moto Zのファヌムりェア」 。

5. Victara_Retail_China_XT1085_5.1_LPE23.32-53_CFC.xml.zip-Lenovo Moto Xデバむスのファヌムりェア。



All Articles