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章),您可能会在里面找到大多数问题的答案