Memory 在内核空间中生成连续区域

Memory 在内核空间中生成连续区域,memory,linux-kernel,device-driver,maping,Memory,Linux Kernel,Device Driver,Maping,我通过alloc\u页面(GFP\u用户)分配内存,并且分配了多个页面。 我需要将其视为连续区域(我需要将其作为缓冲区),因此我希望撤销到它*(vm_beg+off) 我知道在用户空间中通过mmap可以做到这一点,但是我如何在内核空间中做到这一点呢?如果您需要分配虚拟的连续内存,那么您可以使用vmalloc()来完成(更多信息)。但是,实际的物理内存可能是分散的,因此如果您计划将该缓冲区与CPU MMU之外的某些硬件块(例如DMA、PCI总线)一起使用,那么vmalloc()可能不是最佳选择 您

我通过
alloc\u页面(GFP\u用户)
分配内存,并且分配了多个页面。 我需要将其视为连续区域(我需要将其作为缓冲区),因此我希望撤销到它
*(vm_beg+off)


我知道在用户空间中通过
mmap
可以做到这一点,但是我如何在内核空间中做到这一点呢?

如果您需要分配虚拟的连续内存,那么您可以使用
vmalloc()
来完成(更多信息)。但是,实际的物理内存可能是分散的,因此如果您计划将该缓冲区与CPU MMU之外的某些硬件块(例如DMA、PCI总线)一起使用,那么
vmalloc()
可能不是最佳选择

您可能应该在大多数情况下使用
kmalloc()
(更多信息)。区别在于
vmalloc()
总是修改页面表以获得新内存(有点像userland中的
mmap()
)。另一个区别是
kmalloc()
提供了物理上的连续内存,通常比
vmalloc()
更快,后者必须始终修改页表


关于Linux内存的一个很好的信息来源是(具体来说是第15章),您可能会在里面找到大多数问题的答案。

如果您需要分配虚拟的连续内存,那么您可以使用
vmalloc()
这样做(更多信息)。但是,实际的物理内存可能是分散的,因此如果您计划将该缓冲区与CPU MMU之外的某些硬件块(例如DMA、PCI总线)一起使用,那么
vmalloc()
可能不是最佳选择

您可能应该在大多数情况下使用
kmalloc()
(更多信息)。区别在于
vmalloc()
总是修改页面表以获得新内存(有点像userland中的
mmap()
)。另一个区别是
kmalloc()
提供了物理上的连续内存,通常比
vmalloc()
更快,后者必须始终修改页表

关于Linux内存的一个很好的信息来源是(具体来说是第15章),您可能会在里面找到大多数问题的答案