0

「読み取り」の呼び出し後にプロセスがブロックされると、カーネルはiosからデータを読み取り、それをバッファーにコピーしますが、バッファーはカーネル内またはユーザー空間のどこにありますか(「読み取り」のパラメーターです)後の選択のためにカーネル空間からユーザー空間への対処を節約し、さらに、ユーザー空間にははるかに多くのバッファーがあります。ただし、対処するたびにcr3を変更する必要があり、すべてのTLBデータがフラッシュされます。それが、2 つの選択肢について私が知っていることです。他に何かありますか?

4

2 に答える 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 に答える