5

Linuxカーネルは初めてです。そして最近、カーネル2.6.33でsendfileシステムコールを実行しました。以下は私の旅のシーケンスです:

   do_sendfile()
=> do_splice_direct()
=> splice_direct_to_actor()
=> do_splice_to()
=> do_splice_from()
=> splice_read,splice_write

このシーケンス全体を通して、スプライスがDMAコピーを使用する場所は見つかりませんでした。では、DMAコピーはどこで行われているのでしょうか。

4

2 に答える 2

5

スプライスはDMAコピーを行いません。実際、スプライスの主な用途は、コピーをまったく回避することです。バッファをコピーする代わりに、メモリページへの参照を渡そうとします。

スプライスに関連して言及されたDMAは、「リーフ」で​​発生します-スプライスが参照を渡すこれらのページの起点は、たとえば、ディスクコントローラーDMAによって作成され、イーサネットコントローラーDMAによって送信されます。パケットの一部としてのページのコンテンツの一部-少なくとも「完全な」ゼロコピーシーンでは、これを実現することは困難であり、まれです。

スプライスはDMAを実行しません。最初のDMAから最後のDMAへのコピーを有効にしません。

于 2011-09-29T08:28:42.967 に答える
1

私が理解しているように、splice_ *インフラストラクチャは、実行される実際のコピーの量を最小限に抑えることが最善です。せいぜい、読者は作家が埋めているのと同じページのセットから読んでいます。

新しいシステムコールを含むsplice()のさまざまなビットを説明するLWNに関するいくつかの優れた記事があります。

于 2011-09-29T08:14:36.110 に答える