Ext4ファイルシステムについて少し学んでいます。ここ。このリンクの最初の表では、索引ノードのフィールドについて説明します。各フィールド項目には、以下が 1 つずつあります。
オフセット
サイズ
名前
説明する
「説明」フィールドでは、文書には、これらの値のいくつかが低いか高いことが示されています。低/高ビットは何を意味し、このext4ファイルシステムの例でその概念を使用するのはなぜですか?
ベストアンサー1
使用して例を見てみましょう。文書あなたの質問にリンクした注:i_uid
フィールドのサイズ__le16
はで説明されていますLower 16-bits of Owner UID
。このファイルシステムが作成されたシステムが16ビットのユーザーIDのみを許可している場合は、すべてのユーザーIDをこのi_uid
フィールドに入力できます。__le16
実際には「リトルエンディアン16ビット」が表示されます。例えば、2桁の数字しか持てず、コストが29ドルであればそれが正しいので設定されます。
32ビットユーザーIDを使用している場合(より大きなユーザーIDを使用するシステムはないと確信しています)、32ビットユーザーIDはサイズフィールドに収まらないため、__le16
32ビットは2つの16ビットに分割されます。ビット数量。 0(最下位ビット)から31(最上位ビット)までのビット番号を付けると(明確に説明するための慣例のみです)、ビット0〜15(「下位」ビット)がここに配置されます。i_uid
フィールドですが、ビット16-31(「上位」ビット)は合わないため、別の場所に移動する必要があります。 32ビットユーザーIDを使用するLinuxでは、l_i_uid_high
inodeフィールドのサブフィールドで終わります。osd2
例えば、費用は129ドルですが、2桁のボックスがある場合は、下の2桁のボックス29
に入り、01
上の2桁のボックスに入ります。
いくつかの追加の注意:すべてのフィールドは「リトルエンディアン」です。フィールドが 1 バイト以上で構成されている場合 (たとえば、__le16
2 バイトで構成)、最下位バイトが最初に、最上位バイトが最初に順序は 2 番目ですが、順序は次のとおりです。隣接。それはにもかかわらずシステムCPUのエンディアン:これにより、ファイルシステムをディスクに配置する方法がCPUに依存しない場合は、他のシステムがこのファイルシステムを逆バイト順に読み取ることができます。はい、両方のシステムで実行されているext4バージョンは互換性がなければなりません。
さらに、ユーザーIDの下位16ビット(= 2バイト)とユーザーIDの上位16ビットは、ディスク上の2つの場所に保存されます。いいえ隣接: 1 つ目は inode の開始ではオフセット 0x2 に、2 番目は inode の開始ではオフセット 0x74 + 0x4 にあります。 0x74は12バイトフィールドが始まる場所、0x4はi_osd2
inodeのl_i_uid_high
始まりです。定量的分野i_osd2
。これは、「世界が16ビットのユーザーID」であるため、初期ファイルシステムがユーザーIDの最初のフィールドのみを予約したためです。 32ビットのユーザーIDが必要な場合は、別のフィールドがすでに存在するため、2番目の16ビットを隣接して配置することはできません(この場合、フィールドは元の32ビットに制限されていますが小さすぎたため)i_size
。i_size_field
(inodeのオフセット0x6Cを参照)。したがって、使用可能な inode で未使用の最初の場所に配置できます。
この複雑さは、主に以前のバージョンとの互換性に関する考慮事項(ext4は、ユーザーが特別な操作を行わずにext3ファイルシステムを読み取ることができるようにしたい)と将来の拡張に対応することを望むためです。 20/20に基づいて散在する部分を全て合わせることができ、例えば2つの部分に分割することなくi_uid
タイプを見ることができる。__le32
しかし、それが直前に起こったことを置かずに前に進むためにしなければならないことだ。