2

大きなバッファの処理で問題が発生しています。非常に小さなバッファ ( より大きくないPAGE_SIZE) でのみコードをテストしていたので、これまでにこれに遭遇したことはありません。コードは、単にバッファの暗号化または解読に関するものです。

現在、コードはソース バッファと宛先バッファscatterlistの呼び出しで 1 つのオブジェクトを設定するだけです。sg_set_buf()しかし、この単純なことを行う場合、バッファ サイズが を超えると暗号化が行われないようPAGE_SIZEです。

明らかに、単一のページに収まる小さなバッファーを割り当て、適切なmemcpy()呼び出しで「プログレッシブ」に大きなバッファーを処理することで、問題を回避できます。しかし、これは醜いので、時間とリソースがかかります...

scatterlistこの種のバッファのオブジェクトを適切に処理する方法があるかどうか疑問に思っていましたか?

編集:私はすでにこの質問を経験したと言うのを忘れていました。


その他の編集:実際、私はuser173586とまったく同じ問題を抱えています。問題は、渡されたバッファがvmalloc()またはで割り当てられているかどうかを事前に知ることができないということkmalloc()です。これを判断するには、指定されたアドレスが [ VMALLOC_START, VMALLOC_END] の範囲内にあるかどうかを確認するだけです。それが完了したら、オブジェクトを適切にセットアップする必要がありscatterlistます。ここが難しい部分です。

vmalloc()を使用して、 -ed バッファーに対応するページを取得できることはわかっていますvmalloc_to_page()。この時点でstruct page、指定したアドレスに対応するオブジェクトができました。対応するページでオフセットを取得する方法がわかりません。

pageオブジェクトの「有効性」を知るにはどうすればよいですか? vmalloc()ページのどの領域が-ed バッファーによって実際に使用されているかを意味します。一見すると、バッファに使用されている各ページを取得してscatterlistエントリを設定する必要があるように見えますが、どうすればよいかわかりません。

(内部機能についての洞察は役に立ちます。これに関する私の現在の知識は、この記事vmalloc()から推測できます)

4

1 に答える 1

0

重要なのは、kmalloc は常に物理的に連続したページにスペースを返しますが、vmalloc は返さないということです。kmalloc されたバッファーは、virt_addr_valid で検出できます。それが失敗した場合は、バッファー内のすべてのページを繰り返し処理し、個別のスキャッターリスト エントリを作成する必要があります。この最近の commit to clickを見ると例がわかりますが、このコードは同じ単一のスキャッターリストを再利用しています。(len/PAGE_SIZE) + 1 個のスキャッタリスト (最後のものは実際には使用されない可能性があります) を割り当てて、同じ方法で埋めることもできます。

于 2013-07-01T18:01:54.370 に答える