我正按alloc_page(GFP_USER)
分配内存,并且我分配了多个页面。
我需要做的是我会将它视为连续区域(我需要从缓冲区制作),所以我想撤销它*(vm_beg + off)
。
我知道用户空间中的mmap
是可能的,但我如何在内核空间中做到这一点?
答案 0 :(得分:5)
如果您需要分配虚拟连续内存,则可以使用vmalloc()
执行此操作(更多信息here)。实际的物理内存可能会分散,所以如果您计划在CPU MMU之外使用具有某些硬件块(例如DMA,PCI总线)的缓冲区,那么vmalloc()
可能不是您最好的选择。
您可能应该将kmalloc()
用于大多数用途(更多信息here)。不同之处在于vmalloc()
将始终修改页表以获取新内存(有点像用户区中的mmap()
)。另一个区别是,kmalloc()
为您提供 phisically 连续内存,并且通常比vmalloc()
更快,后者必须始终修改页表。
关于Linux内存的非常好的信息来源是Linux Device Drivers 3(特别是你的第15章),你可能会在里面找到大部分问题的答案。