「読み取り」の呼び出し後にプロセスがブロックされると、カーネルはiosからデータを読み取り、それをバッファーにコピーしますが、バッファーはカーネル内またはユーザー空間のどこにありますか(「読み取り」のパラメーターです)後の選択のためにカーネル空間からユーザー空間への対処を節約し、さらに、ユーザー空間にははるかに多くのバッファーがあります。ただし、対処するたびにcr3を変更する必要があり、すべてのTLBデータがフラッシュされます。それが、2 つの選択肢について私が知っていることです。他に何かありますか?
質問する
398 次
2 に答える
1
方法の1つは、mmapを介してカーネルバッファーをプロセスのユーザーアドレス空間にマップするようにデバイスドライバーに要求し、次にremap_pfn_rangeのようなものを使用することです。
ドライバーがI/O操作を終了すると、カーネルバッファーへのコピーでは、cr3を変更したりTLBを撃墜したりする必要はありません。
ユーザープロセスがI/Oを待機している間、別の新しいプロセスの実行がスケジュールされ、I / O操作全体を変更(+ TLBフラッシュ)する必要がある可能性が高くなります。完了しました。
于 2012-06-02T16:10:32.277 に答える
1
カーネルで見られる一般的なパターンの 1 つは、通常、バッファーがカーネル空間kzalloc(PAGE_SIZE, GFP_KERNEL)
(必ずしも PAGE_SIZE ではない) に割り当てられ、そのバッファーに対して読み取りが行われるというものです。次に、simple_read_from_buffer(..)
(fs/libfs.c) を使用してユーザー空間にコピーされます。これは、内部的に を使用しcopy_to_user()
ます。これは通常、単純な I/O 操作またはその他の (例: debugfs) 読み取りに対して行われます。
于 2012-06-02T18:09:32.953 に答える