2013-02-25 224 views
2

我在处理大型缓冲区时遇到了一些麻烦。由于我只在非常小的缓冲区(不大于PAGE_SIZE)上测试我的代码,因此我以前没有遇到过这个问题。代码只是关于加密或解密缓冲区。如何处理Linux Crypto API的多个页面缓冲区和分散列表?

当前,代码只是设置一个scatterlist对象,其中调用源缓冲区和目标缓冲区的地址为sg_set_buf()。但是,看起来,如果这么简单,那么如果缓冲区大小超过PAGE_SIZE,则不会发生加密。

显然,我可以通过分配一个较小的缓冲区来避开这个问题,该缓冲区适合单个页面,并通过调用适当的memcpy()调用来逐步处理较大的缓冲区。但由于这是丑陋的,时间和资源消耗...

我想知道是否有办法很好地处理这种缓冲区的scatterlist对象?

编辑:我忘了说我已经通过了this question


其他编辑:其实,我有完全同样的问题user173586。事情是,我无法预先知道交给我的缓冲区是否分配了vmalloc()kmalloc()。 要确定这一点,我只需要检查给定的地址是否在[VMALLOC_STARTVMALLOC_END]范围内。一旦完成,我仍然要很好地设置scatterlist对象 - 这是最难的部分。

我知道我可以用vmalloc_to_page()检索对应于vmalloc() -ed缓冲区的页面。此时,我有一个对应于我给出的地址的struct page对象。 我不知道如何获得相应页面的偏移量。

我怎样才能知道page对象的“有效性”?我指的是vmalloc() -ed缓冲区实际使用的页面的哪个区域。乍一看,似乎我需要检索缓冲区中使用的每个页面,并为其设置了一个scatterlist条目,但我不知道该怎么做。

(任何在内vmalloc()运作的洞察力可以帮助。我对这个现有的知识可以从this article推断)

回答

0

的关键是kmalloc的永远在物理连续页面返回的空间,但vmalloc的不会。您可以使用virt_addr_valid检测kmalloc'd缓冲区。如果失败,则必须遍历缓冲区中的所有页面并创建单独的散点列表条目。您可以通过查看this recent commitclick来查看示例,但此代码重用相同的单个散点列表。也可以分配(len/PAGE_SIZE)+1分散列表(最后一个可能实际上不会被使用)并以相同的方式填充它们。