如何为Linux Crypto API处理多页缓冲区和散点列表?
我在处理大型缓冲区时遇到一些问题。因为我只在相当小的缓冲区(不大于如何为Linux Crypto API处理多页缓冲区和散点列表?,c,memory,linux-kernel,cryptography,C,Memory,Linux Kernel,Cryptography,我在处理大型缓冲区时遇到一些问题。因为我只在相当小的缓冲区(不大于PAGE\u SIZE)上测试代码,所以我以前从未遇到过这种情况。代码只是关于对缓冲区进行加密或解密 目前,代码仅使用源缓冲区和目标缓冲区的sg_set_buf()调用设置一个scatterlist对象。但是,在执行如此简单的操作时,如果缓冲区大小超过PAGE\u size,则似乎不会发生加密 显然,我可以通过分配一个适合单个页面的较小缓冲区,并通过适当的memcpy()调用“逐步”处理较大的缓冲区来绕过这个问题。但是,由于这是丑
PAGE\u SIZE
)上测试代码,所以我以前从未遇到过这种情况。代码只是关于对缓冲区进行加密或解密
目前,代码仅使用源缓冲区和目标缓冲区的sg_set_buf()
调用设置一个scatterlist
对象。但是,在执行如此简单的操作时,如果缓冲区大小超过PAGE\u size
,则似乎不会发生加密
显然,我可以通过分配一个适合单个页面的较小缓冲区,并通过适当的memcpy()
调用“逐步”处理较大的缓冲区来绕过这个问题。但是,由于这是丑陋的,时间和资源消耗
我想知道是否有一种方法可以很好地处理这种缓冲区的scatterlist
对象
编辑:我忘了说我已经通过了
其他编辑:事实上,我的问题与您的问题完全相同。问题是,我无法预先知道交给我的缓冲区是否分配了
vmalloc()
或kmalloc()
。
要确定这一点,我只需检查给定地址是否在范围[VMALLOC\u START
,VMALLOC\u END
]内。一旦完成,我仍然需要很好地设置散点列表
对象-这是最难的部分
我知道我可以使用vmalloc_to_page()
检索对应于vmalloc()
-ed缓冲区的页面。此时,我有一个与我给出的地址相对应的struct page
对象我不知道如何获得相应页面中的偏移量。
我如何知道页面
对象“有效性”?我的意思是vmalloc()
-ed缓冲区实际使用了页面的哪个区域。乍一看,似乎我需要检索用于缓冲区的每个页面,并为其设置一个散点列表
条目,但我不知道该如何做
(任何关于内部
vmalloc()
功能的洞察都会有所帮助。我目前对此的了解可以从中推断)关键是kmalloc将始终在物理连续页面中返回空间,但vmalloc不会。您可以使用virt_addr_valid检测kmalloc'd缓冲区。如果失败,您必须遍历缓冲区中的所有页面,并创建单独的散列表条目。尽管此代码重用了相同的单个散点列表,但通过查看可以看到一个示例。也可以分配(len/PAGE_SIZE)+1个散点列表(最后一个可能不会被使用),并以相同的方式填写