我在处理大型缓冲区时遇到了一些麻烦。因为我只在非常小的缓冲区(不大于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()
功能的见解都会有所帮助。我目前对此的了解可以从这篇文章中推断出来)