gpt4 book ai didi

c - Linux 内核 : scatterlist maximum "length" allowed?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:57 25 4
gpt4 key购买 nike

解决了我的 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 设置得过大是个问题。大概太大了,有时会跨越到下一页。

在这里正确的做法是什么?我是否必须将它分成许多散点列表,确保每个散点列表都不会转到下一页?这听起来很麻烦,或者是否有一个功能可以帮我做到这一点?还是我只需要确保每个页面都“可用”?

最佳答案

好吧,实际上有两件事困扰着我。第一个是偶尔交给我的内存实际上是从 vmalloc() 分配的内存。这意味着我应该改用 sg_set_page( , vmalloc_to_page() ) 。

第二个问题是scatterwalk函数不正确,很容易测试,如果你设置任何也生成mac的密码,作为第二个缓冲区;

cipherout = kmalloc( size, ...
macout = kmalloc( maclen, ...

这通常会起作用,因为新分配的内存在页面边界上。但是,将其更改为;

 macout = kmalloc( maclen + 16, ...
macout += 16;

我所做的就是分配一个更大的缓冲区,然后启动内存 16 字节。(+1024 或 +3480,无关紧要)这将使 scatterwalk panic 。在 linux-crypto 邮件列表上有一个建议的补丁,这对 future 很有用,但现在对我没有帮助。我需要确保 mac 地址对齐,如果没有对齐,则分配临时缓冲区(至少很小)。

关于c - Linux 内核 : scatterlist maximum "length" allowed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13376825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com