2

我在处理大型缓冲区时遇到了一些麻烦。因为我只在非常小的缓冲区(不大于PAGE_SIZE)上测试我的代码,所以我以前没有遇到过这种情况。该代码只是关于加密或解密缓冲区。

目前,代码只设置一个scatterlist对象,sg_set_buf()调用源缓冲区和目标缓冲区。但看起来,在做这么简单的事情时,如果缓冲区大小超过PAGE_SIZE.

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

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

编辑:我忘了说我已经解决了这个问题


其他编辑:事实上,我的问题与user173586 完全相同。问题是,我无法提前知道交给我的缓冲区是否分配有vmalloc()or kmalloc()。要确定这一点,我只需检查给定地址是否在 [ VMALLOC_START, VMALLOC_END] 范围内。完成后,我仍然需要很好地设置scatterlist对象 - 这是困难的部分 -。

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

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

(任何关于内部vmalloc()功能的见解都会有所帮助。我目前对此的了解可以从这篇文章中推断出来)

4

1 回答 1

0

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

于 2013-07-01T18:01:54.370 回答