Linux 暗号の例を解決し、aead 暗号を正しく呼び出すことができたので、興味深い問題に遭遇しました。
スキャッタリストを次のように定義します。
struct scatterlist sg[2];
sg_init_table(sg, 2 );
sg_set_buf(&sg[0], address, 512);
sg_set_buf(&sg[1], mac, 16);
aead_request_set_crypt(req, sg, sg, 512, iv);
crypto_aead_encrypt(req);
そしてそれはうまくいきます。ただし、バッファ サイズを 512 から 131072 に増やすと、「非常に頻繁に」パニックが発生します。
BUG: unable to handle kernel paging request at ffffeb04000cea80
IP: [<ffffffff812f4880>] scatterwalk_done+0x50/0x60
さて、すべての暗号は scatterwalk_ 関数を呼び出すことになるので、 sg- >length を何か大きい値に設定することに問題があると思います。おそらく大きすぎて、次のページにまたがることがあります。
ここで何をするのが適切ですか?それぞれが次のページに移動しないように、多くのスキャッタリストに分割する必要がありますか? それは面倒に思えますが、これを行う機能はありますか? それとも、各ページが「利用可能」であることを確認する必要がありますか?