Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为Linux Crypto API处理多页缓冲区和散点列表?_C_Memory_Linux Kernel_Cryptography - Fatal编程技术网

如何为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个散点列表(最后一个可能不会被使用),并以相同的方式填写