在内核空间中创建连续区域

Pau*_*aul 1 memory device-driver maping linux-kernel

我正在分配内存alloc_page(GFP_USER),我分配了多个页面.我需要做的是我将它视为连续区域(我需要从缓冲区制作),所以我想撤销它*(vm_beg + off).

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

Que*_*vas 5

如果你需要分配几乎连续的内存,那么你可以vmalloc()这样做(这里有更多信息).实际的物理内存可能会分散,所以如果您计划在CPU MMU之外使用具有某些硬件块(例如DMA,PCI总线)的缓冲区,那么vmalloc()可能不是您最好的选择.

你可能应该kmalloc()用于大多数目的(这里有更多信息).不同之处在于,它vmalloc()总是会修改页面表以获得新的内存(有点像mmap()用户区).另一个区别是,kmalloc()让你phisically连续的内存,比通常更快vmalloc(),其拥有随时修改页表.

有关Linux内存的非常好的信息来源是Linux设备驱动程序3(特别是第15章),您可能会在内部找到大部分问题的答案.