解决了我的 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 设置为较大的值是一个问题。大概太大了,有时会翻到下一页。
在这里做什么是正确的?我是否必须将它分成许多分散列表,确保每个列表都不会转到下一页?这听起来很麻烦,或者有没有为我做这件事的功能?还是我只需要确保每个页面都是“可用的”?