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

时间:2012-02-04 07:47:37

标签: memory linux-kernel device-driver maping

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

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

1 个答案:

答案 0 :(得分:5)

如果您需要分配虚拟连续内存,则可以使用vmalloc()执行此操作(更多信息here)。实际的物理内存可能会分散,所以如果您计划在CPU MMU之外使用具有某些硬件块(例如DMA,PCI总线)的缓冲区,那么vmalloc()可能不是您最好的选择。

您可能应该将kmalloc()用于大多数用途(更多信息here)。不同之处在于vmalloc()将始终修改页表以获取新内存(有点像用户区中的mmap())。另一个区别是,kmalloc()为您提供 phisically 连续内存,并且通常比vmalloc()更快,后者必须始终修改页表。

关于Linux内存的非常好的信息来源是Linux Device Drivers 3(特别是你的第15章),你可能会在里面找到大部分问题的答案。