gpt4 book ai didi

c - vmalloc 和 kmalloc 有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 16:14:45 30 4
gpt4 key购买 nike

我四处搜索,发现大多数人都提倡使用 kmalloc,因为您可以保证获得连续的物理内存块。但是,如果找不到您想要的连续物理 block ,似乎 kmalloc 也会失败。
拥有连续的内存块有什么好处?具体来说,为什么我需要在系统调用 中有一个连续的物理 内存块?有什么理由我不能只使用 vmalloc 吗?
最后,如果我要在处理系统调用期间分配内存,我应该指定 GFP_ATOMIC 吗?系统调用是否在原子上下文中执行?

GFP_ATOMIC
The allocation is high-priority and does not sleep. This is the flag to use in interrupt handlers, bottom halves and other situations where you cannot sleep.

GFP_KERNEL This is a normal allocation and might block. This is the flag to use in process context code when it is safe to sleep.

最佳答案

如果缓冲区将被物理寻址总线(如 PCI)上的 DMA 设备访问,您只需要担心使用物理连续内存。问题在于许多系统调用无法知道它们的缓冲区最终是否会传递给 DMA 设备:一旦将缓冲区传递给另一个内核子系统,您就真的不知道它要去哪里了。即使内核 今天不使用 DMA 缓冲区, future 的开发也可能会这样做。

vmalloc 通常比 kmalloc 慢,因为它可能必须将缓冲区空间重新映射到几乎连续的范围内。 kmalloc 从不重新映射,但如果不使用 GFP_ATOMIC 调用,kmalloc 可能会阻塞。

kmalloc 可提供的缓冲区大小有限:128 KB*)。如果您需要一个非常大的缓冲区,则必须使用 vmalloc 或其他一些机制,例如在启动时保留高端内存。

*) This was true of earlier kernels. On recent kernels (I tested this on 2.6.33.2), max size of a single kmalloc is up to 4 MB! (I wrote a fairly detailed post on this.) — kaiwan

对于系统调用,您不需要将 GFP_ATOMIC 传递给 kmalloc(),您可以使用 GFP_KERNEL。您不是中断处理程序:应用程序代码通过陷阱进入内核上下文,它不是中断。

关于c - vmalloc 和 kmalloc 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/116343/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com