我在处理大型缓冲区时遇到了一些麻烦。由于我只在非常小的缓冲区(不大于PAGE_SIZE
)上测试我的代码,因此我以前没有遇到过这个问题。代码只是关于加密或解密缓冲区。如何处理Linux Crypto API的多个页面缓冲区和分散列表?
当前,代码只是设置一个scatterlist
对象,其中调用源缓冲区和目标缓冲区的地址为sg_set_buf()
。但是,看起来,如果这么简单,那么如果缓冲区大小超过PAGE_SIZE
,则不会发生加密。
显然,我可以通过分配一个较小的缓冲区来避开这个问题,该缓冲区适合单个页面,并通过调用适当的memcpy()
调用来逐步处理较大的缓冲区。但由于这是丑陋的,时间和资源消耗...
我想知道是否有办法很好地处理这种缓冲区的scatterlist
对象?
编辑:我忘了说我已经通过了this question。
其他编辑:其实,我有完全同样的问题user173586。事情是,我无法预先知道交给我的缓冲区是否分配了vmalloc()
或kmalloc()
。 要确定这一点,我只需要检查给定的地址是否在[VMALLOC_START
,VMALLOC_END
]范围内。一旦完成,我仍然要很好地设置scatterlist
对象 - 这是最难的部分。
我知道我可以用vmalloc_to_page()
检索对应于vmalloc()
-ed缓冲区的页面。此时,我有一个对应于我给出的地址的struct page
对象。 我不知道如何获得相应页面的偏移量。
我怎样才能知道page
对象的“有效性”?我指的是vmalloc()
-ed缓冲区实际使用的页面的哪个区域。乍一看,似乎我需要检索缓冲区中使用的每个页面,并为其设置了一个scatterlist
条目,但我不知道该怎么做。
(任何在内vmalloc()
运作的洞察力可以帮助。我对这个现有的知识可以从this article推断)