c - vmalloc 和 kmalloc 有什么区别?

标签 c linux-kernel kmalloc vmalloc

我四处搜索,发现大多数人都提倡使用 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/

相关文章:

c - 如何声明一个带有链表的结构体变量?

c - 从输入文件读取数组时出现段错误(核心转储)错误

linux - 我如何找到系统调用(一些数字)例程的位置?

linux-kernel - Linux 内核中的 jiffies 在哪里计算?

linux - 你能帮我了解一下 tcp_sk 和 udp_sk 这种类型的功能吗?

c - 将值列表传递到内核空间

c - Splint 无法检查指向堆栈变量的指针上的 maxSet

linux - kmalloc返回的地址的物理地址

linux - kmalloc 中 GFP_USER 标志的用途是什么?

c - fork与动态库交互