第4章 文書管理

0. ファイル管理の初歩

1692539406714

ファイルにはどのような属性がありますか? ファイル名: ファイル名は、主にユーザーがファイルを見つけやすくするために、ファイルを作成したユーザーによって決定されます。同じ名前のファイルを同じディレクトリ内に置くことはできません。

識別子: システム内の各ファイルの識別子は一意であり、ユーザーには判読できないため、識別子はオペレーティング システムが各ファイルを区別するために使用する内部名にすぎません。

タイプ: ファイルのタイプを指定します。

場所: ファイルが保存されているパス (ユーザーが使用する)、外部メモリ内のアドレス (オペレーティング システムによって使用され、ユーザーには表示されません)

サイズ: ファイルサイズを指定します

作成時刻、最終変更時刻、ファイル所有者情報

保護情報: ファイルを保護するためのアクセス制御情報

1692539796977

1692539968546

1692540057735

ファイル共有: 複数のユーザーがファイルを共有できるようにします。

ファイル保護: 異なるユーザーがファイルに対して異なる操作権限を持っていることを確認する方法

1692540294000

1. ファイルの論理構造

1692540619152

非構造化ファイル: ファイル内のデータは、一連のバイナリ ストリームまたは文字ストリームで構成されます。「ストリーミング ファイル」とも呼ばれます。例: Windows オペレーティング システムの .txt ファイル。

構造化ファイル: 類似したレコードのグループで構成され、「レコード ファイル」とも呼ばれます。各レコードは複数のデータ項目で構成されます。例: データベース テーブル ファイル。一般に、各レコードにはキー (異なるレコードを識別するための ID) として使用できるデータ項目があります。

データベーステーブルファイル。一般に、各レコードにはキーとして使用できるデータ項目が 1 つあります。各レコードの長さ (占有される記憶領域) が等しいかどうかに応じて、レコードは固定長レコードと可変長レコードに分類できます

シーケンスファイル

シーケンシャル ファイル: ファイル内のレコードは 1 つずつシーケンシャル (論理的に) 配置されており、レコードは固定長または可変長にすることができます。個々のレコードは、物理的に連続して、または連鎖的に保存できます。

1692540847554

1692540887665

1692541109930

インデックスファイル

インデックス テーブル自体は、固定長レコードのシーケンシャル ファイルですしたがって、i 番目のレコードに対応するインデックス エントリを迅速に見つけることができます。

インデックス番号の内容としてキーワードを使用することができ、キーワード順に並べれば半分のキーワードでの検索にも対応できます。

レコードを追加/削除するたびに、インデックス テーブルを変更する必要があります。インデックスファイルは検索速度が非常に速いため、主に情報処理の適時性が要求される場面で使用されます。

さらに、異なるデータ項目を使用して複数のインデックス テーブルを作成できます。例: 学生情報テーブルでは、キーワード「学生番号」を使用してインデックス テーブルを作成できます。「name」を使用してインデックス テーブルを作成することもできます。これにより、「名前」に基づいてファイルをすばやく検索できます。(例: SQL は、特定のデータ項目に基づいてインデックスを作成する機能をサポートしています)

1692541384027

インデックスシーケンスファイル

索引付き順編成ファイルは、索引ファイルと順編成ファイルの概念を組み合わせたものです。インデックス シーケンス ファイルでは、ファイルのインデックス テーブルも作成されますが、異なる点は、各レコードがインデックス テーブル エントリに対応するのではなく、レコードのグループがインデックス テーブル エントリに対応することです。

1692541616073

1692541728032

2.ファイルディレクトリ

1692541844427

ファイル制御ブロック

1692541970724

順序付けられた FCB の集合は「ファイル ディレクトリ」と呼ばれ、FCB はファイル ディレクトリ エントリです。FCBには、ファイルの基本情報(ファイル名、物理アドレス、論理構造、物理構造など)、アクセス制御情報(読み書き可能かどうか、禁止ユーザーのリストなど)、利用情報(ファイル名、物理アドレス、論理構造、物理構造など)が含まれます。ファイルの作成時間、変更時間など)。

ディレクトリに対してどのような操作を実行する必要がありますか?

検索: ユーザーがファイルを使用したい場合、システムはファイル名に基づいてディレクトリを検索し、ファイルに対応するディレクトリ エントリを見つけます。

ファイルの作成: 新しいファイルを作成するときは、そのファイルが属するディレクトリにディレクトリ エントリを追加する必要があります。

ファイルの削除: ファイルを削除するときは、ディレクトリ内の対応するディレクトリ エントリを削除する必要があります。

ディレクトリの表示: ユーザーは、ディレクトリ内のすべてのファイルおよび対応する属性の表示など、ディレクトリの内容の表示を要求できます。

ディレクトリを変更する: 一部のファイル属性はディレクトリに保存されるため、これらの属性が変更された場合は、対応するディレクトリ項目を変更する必要があります (ファイル名の変更など)。

単一マシンの単一レベルのディレクトリ

初期のオペレーティング システムではマルチレベル ディレクトリがサポートされておらず、システム全体でディレクトリ テーブルが 1 つだけ作成され、各ファイルが 1 つのディレクトリ エントリを占有していました。

「名前によるアクセス」が実装されていますが、重複したファイル名は許可されません。

ファイルを作成するときは、ディレクトリテーブルに同名のファイルが存在するかどうかを確認し、重複しないことを確認してからファイルを作成し、新しいファイルに対応するディレクトリエントリを挿入します。ディレクトリテーブルに追加します。

明らかに、単一レベルのディレクトリ構造はマルチユーザー オペレーティング システムには適していません。

1692542214578

2 レベルのディレクトリ構造

初期のマルチユーザー オペレーティング システムでは、2 レベルのディレクトリ構造が使用されていました。マスターファイルディレクトリ(MFD、Master File Directory)とユーザーファイルディレクトリ(UFD、User Flie Directory)に分かれています。

1692542328638

複数レベルのディレクトリ構造

1692542476523

ユーザー (またはユーザー プロセス) がファイルにアクセスする場合、ファイル パス名を使用してファイルを識別する必要があります。ファイル パス名は文字列です。すべてのレベルのディレクトリは「/」で区切られます。ルートディレクトリから始まるパスを絶対パスといいます。

たとえば、この時点で「写真」のディレクトリ ファイルが開かれている、つまりこのディレクトリ テーブルがメモリに転送されている場合、それを「現在のディレクトリ」として設定できます。ユーザーがファイルにアクセスする場合、現在のディレクトリから始まる「相対パス」を使用できます。

「カレントディレクトリ」と「相対パス」の導入により、ディスクI/Oの数が減少していることがわかります。これにより、ファイルへのアクセス効率が向上します。

ツリーディレクトリ構造はファイルを簡単に分類でき、階層構造が明確で、ファイルをより効果的に管理および保護することもできます。ただし、ツリー構造はファイル共有には不便です。このため、「非巡回グラフディレクトリ構造」が提案されています。

非巡回グラフのディレクトリ構造

1692542619989

異なるファイル名で同じファイルを指定したり、同じディレクトリを指定したりすることもできます (同じディレクトリ内のすべてを共有)。

現時点でノードを共有している場所の数を記録するには、共有ノードごとに共有カウンタを設定する必要があります。ユーザーがノードの削除リクエストを行うと、ユーザーの FCB が削除されるだけで、共有カウンタが 1 ずつ減ります。共有ノードは直接削除されません。

ノードは、共有カウンタが 0 に減少した場合にのみ削除されます。

注: ファイルの共有は、ファイルのコピーとは異なります。共有ファイルでは、各ユーザーが同じファイルを指しているため、いずれかのユーザーがファイル データを変更する限り、すべてのユーザーがファイル データの変更を確認できます。

インデックスノード

1692542794405

外部メモリに格納されているインデックスノードを「ディスクインデックスノード」と呼び、インデックスノードがメモリ上に配置されている場合を「メモリインデックスノード」と呼びます。

対照的に、ファイルが変更されているかどうか、現時点でファイルにアクセスしているプロセスの数など、いくつかの情報をメモリ インデックス ノードに追加する必要があります。

1692542913213

3. ファイルの物理構造

1692881602891

1692883438327

メモリ管理では、プロセスの論理アドレス空間がページに分割されます。

同様に、外部メモリ管理においても、ファイルデータの管理を容易にするために、ファイルの論理アドレス空間をファイル「ブロック」に一つずつ分割します。

したがって、ファイルの論理アドレスは、(論理ブロック番号、ブロック内のアドレス)の形で表すこともできる。

継続的な割り当て

連続割り当てでは、各ファイルがディスク上の連続したブロックのセットを占有する必要があります。

ユーザーがアクセスする論理ブロック番号を指定すると、オペレーティング システムはファイルに対応するディレクトリ エントリ (FCB) を検索します (物理ブロック番号 = 開始ブロック番号 + 論理ブロック番号)。

論理ブロック番号に対応する物理ブロック番号を直接計算できるため、連続割り当てはシーケンシャルアクセスとダイレクトアクセス(ランダムアクセス)をサポートします。

ディスクブロックを読み取るときは、ヘッドを移動する必要があります。2 つのディスク ブロックにアクセスする距離が離れるほど、ヘッドの移動にかかる時間が長くなります。

結論: 連続して割り当てられたファイルは、順次読み取り/書き込みを行った場合に最速になります。

1692885383275

1692885592938

結論: 継続的に割り当てられたファイルを使用して拡張するのは物理的に不便です。

結論: 物理的に連続割り当てを使用すると、ストレージ領域の使用率が低くなり、使いにくいディスクの断片が生成されます。Compact を使用すると
断片に対処できますが、時間がかかります。

利点: シーケンシャル アクセスと直接アクセス (つまり、ランダム アクセス) をサポートし、連続的に割り当てられたファイルはシーケンシャルにアクセスすると最速になります。

短所: ファイル拡張には不便、ストレージ容量の使用率が低く、ディスクの断片化が発生する

リンクの割り当て

暗黙的なリンク

ユーザーがアクセスする論理ブロック番号 i を与えると、オペレーティング システムはファイル ... に対応するディレクトリ エントリ (FCB) を見つけます。
ディレクトリ エントリから開始ブロック番号 (つまり、ブロック o) を見つけ、論理ブロック番号を読み取ります。ブロック番号 0 のメモリなので、論理ブロック 1 に格納されている物理ブロック番号がわかり、次に論理ブロック 1 を読み出し、次に論理ブロック 2 の格納場所を見つけます。
したがって、論理ブロック番号 i を読み取るには、合計 i+1 回のディスク I/O 時間が必要になります。

1692885776915

結論: チェーン割り当て (暗黙的リンク) を使用するファイルは、ランダム アクセスではなくシーケンシャル アクセスのみをサポートしており、検索効率が低いです。さらに、次のディスク ブロックへのポインタも少量の記憶領域を消費します。

結論: 暗黙的リンクのリンク割り当て方法は、ファイル展開に非常に便利です。さらに、空きディスクブロックをすべて利用できるため、断片化の問題がなく、外部メモリの使用率も高くなります。

リンクを表示

1692885983741

注: 1 つのディスクには 1 つの FAT のみが設定されます。ブート時に、FAT がメモリに読み込まれ、メモリ内に常駐します。各 FAT エントリは物理的に連続して格納され、各エントリの長さは同じであるため、「物理ブロック番号」フィールドは暗黙的である可能性があります。

ディレクトリエントリから開始ブロック番号を見つけ、i>0 の場合、メモリ内のファイルアロケーションテーブル FAT を照会し、論理ブロック i に対応する物理ブロック番号を見つけます。論理ブロック番号を物理ブロック番号に変換するプロセスには、ディスク読み取り操作は必要ありません。

結論: チェーン割り当て (明示的リンク) を使用したファイルは、シーケンシャル アクセスとランダム アクセスをサポートします (論理ブロック i にアクセスする場合、前の論理ブロック 0 ~ i-1 に順番にアクセスする必要はありません)。このプロセスはディスク アクセスを必要としないため、アクセス速度は暗黙的リンクよりもはるかに高速です。

明らかに、明示的なリンクでは外部の断片化が発生せず、ファイルは簡単に拡張できます。

インデックスの割り当て

インデックス割り当てにより、ファイルをさまざまなディスク ブロックに個別に割り当てることができます。システムはファイルごとにインデックス テーブルを作成します。インデックス テーブルには、ファイルの各論理ブロックに対応する物理ブロックが記録されます (インデックス テーブルの機能はインデックス テーブルの機能と似ています)。ページ テーブル - 論理ページと物理ページの間のマッピング関係を確立します)。インデックステーブルに格納されるディスクブロックをインデックスブロックと呼びます。ファイルデータが保存されているディスクブロックをデータブロックと呼びます。

1692886421763

インデックス割り当て方法がランダム アクセスをサポートできることがわかります。ファイル拡張も実装は簡単ですが (ファイルに空きブロックを割り当て、インデックス テーブル エントリを追加するだけです)、インデックス テーブルには一定量の記憶領域が必要です。

① リンク方式: インデックステーブルが大きすぎて 1 つのインデックスブロックに収まらない場合、複数のインデックスブロックをリンクして保存できます。

1692886742918

②複数レベルのインデックス:複数レベルのインデックスを作成します(原理は複数レベルのページテーブルと似ています)。第 1 レベルのインデックス ブロックが第 2 レベルのインデックス ブロックを指すようにします。ファイル サイズの要件に応じて、インデックス ブロックの 3 番目と 4 番目のレベルを確立することもできます。

1692886941967

K レベルのインデックス構造を使用すると、トップレベルのインデックス テーブルはメモリに転送されないため、データ ブロックへのアクセスには K+1 ディスク読み取り操作のみが必要になります。

③ハイブリッド指数:複数の指数配分方法を組み合わせた指数。たとえば、ファイルのトップレベルのインデックス テーブルには、直接アドレス インデックス (データ ブロックを直接指す)、第 1 レベルの間接インデックス (単一レベルのインデックス テーブルを指す)、および 2 レベルの間接インデックスの両方が含まれます。インデックス (2 レベルのインデックス テーブルを指します)。

1692887149159

超、超、超重要なテスト ポイント: ① マルチレベル インデックスとハイブリッド インデックスの構造に基づいてファイルの最大長を計算できなければなりません (重要: 各レベルのインデックス テーブルの最大長は 1 を超えることはできません)ブロック); ② 特定のデータ ブロックにアクセスするために何が必要かを自分で分析できなければなりません ディスク読み取り数 (キー: FCB には最上位のインデックス ブロックへのポインターが含まれるため、最上位のインデックス ブロックはFCB に従って読み取られる必要があります。次のレベルのインデックス ブロックが読み取られるたびに、ディスク読み取り操作が必要です。さらに、質問条件 (最上位のインデックス ブロックがメモリに転送されているかどうか) にも注意してください)

1692887337861

4. 論理構造 VS 物理構造

1692888394739

5. ファイルストレージスペースの管理

1692969492559

1692969571055

フリーリスト方式

連続配分方式に適しています」

ディスク ブロックの割り当て方法: メモリ管理における動的パーティション割り当てとよく似ており、連続した記憶領域がファイルに割り当てられます。最初の適応、最良の適応、最悪の適応などのアルゴリズムを使用して、ファイルに割り当てる間隔を決定することもできます。

ディスク ブロックをリサイクルする方法: メモリ管理における動的パーティション割り当てと非常によく似ていますが、ストレージ領域をリサイクルする場合は、次の 4 つの状況を満たす必要があります - ① リサイクル領域の前後に隣接する空き領域がない、② ディスク ブロックの前後の両方リサイクルエリアは無料エリアです; ③ リサイクルエリアの前は無料エリアです; ④ リサイクルエリアの後ろは無料エリアです。つまり、リサイクルする際にはテーブルアイテムのマージに注意する必要があります。

1692969794074

フリーリスト方式

1692969832644

1692969860016

空きディスク チェーン:

オペレーティング システムは、チェーン ヘッドとチェーン テールのポインタを保存します。

割り当て方法: ファイルが K ディスク ブロックに適用される場合、チェーン ヘッドから開始して K ディスク ブロックが割り当てられ、空きチェーンのチェーン ヘッド ポインタが変更されます。

リサイクル方法: リサイクルされたディスク ブロックが順番にチェーンの終端に掛けられ、フリー チェーンのチェーン テール ポインタが変更されます。

個別に割り当てられた物理構造に適しています。複数のディスク ブロックを 1 つのファイルに割り当てる場合、操作を複数回繰り返す必要がある場合があります。

空きエクステント チェーン:

オペレーティング システムは、チェーン ヘッドとチェーン テールのポインタを保存します。

割り当て方法: ファイルが K 個のディスク ブロックに適用される場合、ファースト アダプテーション、ベスト アダプテーション、およびその他のアルゴリズムを使用してチェーン ヘッドから検索し、アルゴリズム ルールに従って要件を満たすサイズの空きディスクを見つけて、割り当てることができます。それをファイルに保存します。適切な連続空きブロックがない場合は、異なるエクステントから 1 つのファイルにディスク ブロックを同時に割り当てることもできます。割り当て後に、対応するチェーン ポインタ、エクステント サイズ、およびその他のデータの変更が必要になる場合があることに注意してください。

リサイクル方法: リサイクルエリアがフリーエクステントに隣接している場合、リサイクルエリアをフリーエクステントに統合する必要があります。リカバリ領域がどの空き領域にも隣接していない場合、リカバリ領域は別の空きエクステントとしてチェーンの最後にハングされます。

離散割り当てと連続割り当ての両方に適用できます。複数のディスク ブロックを 1 つのファイルに割り当てる方が効率的です

ビットマップ方式

1692970270901

ビットマップ: 各バイナリ ビットはディスク ブロックに対応します。この例では、「0」はディスク ブロックが空いていることを意味し、「1」はディスク ブロックが割り当てられていることを意味します。

割り当て方法: ファイルに K 個のブロックが必要な場合、① ビットマップを順次スキャンして K 個の隣接または隣接しない「0」を見つけます、② フォント サイズとビット番号に基づいて対応するディスク ブロック番号を計算し、対応するディスク ブロックを割り当てます。 to File; ③対応するビットを「1」に設定します。

リサイクル方法: ① 復元したディスクブロック番号に基づいて、対応するフォントサイズとビット数を計算します; ② 対応するバイナリビットを「0」に設定します

グループ連携方法

フリー リスト方式およびフリー リンク リスト方式は、フリー リストまたはフリー リンク リストが大きすぎる可能性があるため、大規模なファイル システムには適していません。グループ リンク方式は、UNIX システムでディスクの空きブロックを管理するために使用されます。

ディスクブロックは、ファイルボリュームのディレクトリ領域に特別に「スーパーブロック」として使用され、システム起動時にスーパーブロックをメモリに読み込む必要があります。そして、メモリと外部メモリ内の「スーパーブロック」データの一貫性を確保する必要があります。」

1692970425386

1692970512720

1692970783776

6. ファイルの基本操作

ファイルを作成する

オペレーティング システムが Create システム コールを処理するとき、主に次の 2 つのことを行います。

1. 外部メモリ内のファイルに必要なスペースを見つけます (空きスペースを見つけるために、前のセクションで学習したフリー リンク リスト方法、ビットマップ、グループ リンク方法、およびその他の管理戦略を組み合わせます)
ファイルの格納パス情報に基づいて、ディレクトリ(ここではD:/Demoディレクトリ)に対応するディレクトリファイルを検索し、そのディレクトリ内にファイルに対応するディレクトリエントリを作成します。ディレクトリ エントリには、ファイル名や外部ストレージ内のファイルの場所などの情報が含まれています。

ファイルの削除

オペレーティング システムが Delete システム コールを処理するとき、主に次のようなことを行います。

1. ファイルの保存パスに従って、対応するディレクトリ ファイルを検索し、そのディレクトリからファイル名に対応するディレクトリ エントリを検索します。

2. ディレクトリエントリに記録されているファイルの保存場所、ファイルサイズ、その他の情報に従って、ファイルが占有していたディスクブロックが回復されます。(ディスクブロックをリサイクルする場合、フリーリスト方式、フリーリンクリスト方式、ビットマップ方式などの管理戦略に応じて異なる処理を行う必要があります。)

3.ファイルに対応するディレクトリ エントリをディレクトリ テーブルから削除します。

ファイルを開く

オペレーティング システムがオープン システム コールを処理するとき、主にいくつかのことを行います。
1. ファイル ストレージ パスに従って対応するディレクトリ ファイルを検索し、そのディレクトリからファイル名に対応するディレクトリ エントリを検索し、ユーザーが指定された操作権限。
2. ディレクトリ エントリをメモリ内の「オープン ファイル テーブル」にコピーします。そして、対応するエントリ番号をユーザーに返します。次に、ユーザーはオープン ファイル テーブルの番号を使用して、操作対象のファイルを指定します。

ファイルを閉じる

ファイルを読み取る

ファイルを書き込む

1692971472021

7. ファイル共有

1692971518218

知らせ:

複数のユーザーが同じファイルを共有するということは、システム内にファイル データの「コピー」が 1 つだけ存在することを意味します。また、ユーザーがファイルのデータを変更している限り、他のユーザーもファイル データの変更を見ることができます。

複数のユーザーが同じファイルを「コピー」すると、システム内にファイル データの「複数のコピー」が存在します。あるユーザーが自分のファイル データを変更しても、他のユーザーのファイル データには影響を与えません。

インデックスノードによる共有方式(ハードリンク)

シンボリックチェーン(ソフトリンク)による共有方式

1692971730174

1692971853276

8. ファイル保護

1692971895048

パスワード保護

利点: パスワードの保存にかかるスペースのオーバーヘッドはそれほど大きくなく、パスワードの検証にかかる時間のオーバーヘッドも非常にわずかです。

短所: 正しい「パスワード」はシステム内に保存されるため、安全性が十分ではありません。

暗号化保護

利点: 強力な機密性、システムに「パスワード」を保存する必要がない

短所: エンコード/デコード、または暗号化/復号化には一定の時間がかかります。

アクセス制御

各ファイルの FCB (またはインデックス ノード) にアクセス制御リスト(ACL) を追加します。これにより、各ユーザーがファイルに対して実行できる操作が記録されます。

1692972125128

1692972358229

9. ファイルシステムの階層構造

1692972545431

ファイル システムの階層構造を覚えるのに役立つ例を使用します。
ユーザーがファイル「D:/Working Directory/Student Information..xlsx」の最後の 100 レコードの削除を要求したとします。

1. ユーザーは、オペレーティング システムが提供するインターフェイス - ユーザー インターフェイスを通じて上記のリクエストを行う必要があります。

2. ユーザーがファイルのストレージ パスを指定するため、オペレーティング システムはディレクトリを階層ごとに検索して、対応するディレクトリ エントリ (ファイル ディレクトリ システム) を見つける必要があります。

3.ユーザーごとにファイルの操作権限が異なるため、セキュリティを確保するためには、ユーザーにアクセス権限があるかどうかをアクセス制御モジュール(アクセス制御検証層)で確認する必要があります。

4.
ユーザーのアクセス権を確認した後、ユーザーが提供した「レコード番号」を、対応する論理アドレス、つまり論理ファイル システムおよびファイル情報バッファー5に変換する必要があります。ターゲットレコードに対応する論理アドレスがわかったら、それを実際の物理アドレス、つまり物理ファイルシステムに変換する必要があります。

6. このレコードを削除するには、ディスクデバイス (デバイス管理プログラムモジュール) にリクエストを行う必要があります。

7. これらのレコードを削除すると、一部のディスク ブロックが空くため、これらのアイドル状態のディスク ブロックをリサイクルする必要があります - 補助割り当てモジュール

10. ファイルシステムのグローバル構造(レイアウト)

外部メモリ内のファイルシステムの構造

物理フォーマット、つまり低レベルのフォーマット。セクタを分割し、不良セクタを検出し、不良セクタをスペア セクタに置き換えます。

論理フォーマット後、ディスクはパーティション(ボリューム)に分割され、各パーティションのファイルシステムの初期化が完了します。

注: 論理フォーマット後、灰色の部分には実際のデータがあり、白い部分にはデータがありません。

メモリ内のファイルシステムの構造

1692973113788

11.仮想ファイルシステム

通常のファイルシステム

1692973268856

仮想ファイルシステム

仮想ファイルシステムの特徴:
① 統一された標準的なシステムコールインターフェースを上位ユーザープロセスに提供し、基盤となる特定のファイルシステムの実装差異を保護します。

②VFS では、基礎となるファイル システムがオープン/読み取り/書き込みなどの特定の指定された機能を実装する必要があります。新しいファイル システムを特定のオペレーティング システムで使用する場合は、オペレーティング システムの VFS 要件を満たしている必要があります。

③ファイルが開かれるたびに、VFS はメイン メモリに新しい vnode を作成し、ファイルがどのファイル システムに保存されているかに関係なく、統一されたデータ構造を使用してファイルを表現します。

注: vnode はメイン メモリにのみ存在し、inode はメイン メモリに転送され、外部メモリに保存されます。

1692973404336

4.3_3_仮想ファイル システム_bilibili_bilibili

おすすめ

転載: blog.csdn.net/m0_57385165/article/details/132507195