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

最佳答案

如果缓冲区将由物理寻址总线(如PCI)上的DMA设备访问,则只需要担心使用物理上连续的内存。问题在于,许多系统调用无法知道其缓冲区是否最终会传递给DMA设备:将缓冲区传递给另一个内核子系统后,您实际上就无法知道它的去向。即使内核今天不将缓冲区用于DMA,将来的开发也可能会使用。

vmalloc通常比kmalloc慢,因为vmalloc必须将缓冲区空间重新映射到实际上连续的范围内。 kmalloc永远不会重新映射,尽管如果未使用GFP_ATOMIC调用,kmalloc可能会阻塞。

kmalloc可以提供的缓冲区大小受到限制:128 KB *。如果需要非常大的缓冲区,则必须使用vmalloc或其他一些机制,例如在引导时保留大内存。



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

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

10-12 16:09