web-dev-qa-db-ja.com

ディスクの読み取りまたは書き込みが発生した場合、データはどこに送られますか?

バッファを含むディスクコントローラのようなものがあることは理解していますが、CPUがこのバッファから直接読み取るのか、それともデータを最初にメモリ内の特定の場所に移動してから自分自身を読み取る必要があるのか​​疑問に思っていましたCPUによって?

バッファが何と呼ばれるかも知っている人はいますか?そして、DMAはこれらすべてにどのように適合しますか?

10

ディスク読み取りの場合、データフローは基本的に次のとおりです。

  • 読み取り/書き込みアセンブリが要求されたシリンダーに配置された後、要求されたr/wヘッドが選択されます。
  • 各セクターで、セクターIDが読み取られます。読み取られたセクター番号が要求されたセクター番号と一致する場合、セクターデータが読み取られます。
  • セクターデータはシリアルビットストリームとして読み取られ、バイトに変換されます。
  • セクターのバイトはセクターバッファー(通常はコントローラーのSRAM)に格納されます。このセクターバッファは「ディスクキャッシュ」とは異なります。
  • セクター全体が読み取られると、データはECCを使用して検証され、おそらく修正されます。
  • 検証されると、セクターデータはコントローラーからホストPCに転送されます。注:このセクターバッファーの存在はよく知られておらず、ホスト(egATA)インターフェイスでの転送速度が制限されているという誤った情報が広まっています。 R/Wヘッドのビットレートによって制限されます。これらの2つのデータ転送は独立した順次操作であり、同時ではないため、これは完全に誤りです。
  • pCはATAインターフェイスを介してディスクコントローラからデータを受信するため、PCは次のいずれかを使用できますプログラムドI/O(CPUはATAポートのデータレジスタを繰り返し読み取り、値を宛先メモリにコピーします)または[〜#〜] dma [〜#〜](DMAコントローラは、ATAポートのデータレジスタからメモリバッファにNバイトをコピーするように設定されています。 oさらなるCPU介入)。
  • データを受信するPCのメモリ「バッファ」は、アプリケーションのバッファ(ブロックI/Oシステムコールを使用する場合)、ファイルシステム制御下の内部システムバッファ、またはプログラムやデータメモリの場合があります。データがスワップ領域(またはページファイル)からのものである場合。

ディスクへの書き込みも同様ですが、データがPCからディスクコントローラーに転送され、ECCが計算され、要求されたセクターが特定されてから、データがセクターバッファーからプラッターに書き込まれる点が異なります。

追加のクレジットの場合:

"scatter-gather"転送を読んでください。これはDMAチェーンを使用しますおよびメモリアドレスとバッファ長のスキャッタギャザーリスト。 1つの大きな連続したメモリバッファの代わりに、「スキャッタギャザー」転送を使用すると、ディスクI/O要求に対して非連続のメモリバッファを集約できます。

20
sawdust

カーネルがディスクのドライバを割り当てた特定のメモリ領域に入ります。具体的な名前はないと思います。このメモリ領域は通常、 リングバッファ として設定されます。 OSによっては、このメモリをアプリケーションが使用するためにユーザースペースにもう一度コピーする場合があります。

[〜#〜] dma [〜#〜] は「ダイレクトメモリアクセス」です。これは、ディスクドライブのコントローラがCPUを使用せずにRAMより多くのデータが利用可能かどうかを繰り返し尋ねます(ポーリングと呼ばれます-物事の使用方法の実行方法)。代わりに、バッファー全体が転送されたら、次に、コントローラーはCPUに割り込んで、データが使用可能になったことを通知します。

さらに低いレベルに興味がある場合、ドライバーは ioctl 呼び出しを行います。

2