Linux kernel linux内核预分配的非映射虚拟内存

Linux kernel linux内核预分配的非映射虚拟内存,linux-kernel,virtual-memory,memory-mapping,Linux Kernel,Virtual Memory,Memory Mapping,我有以下场景: qemu kvm(来宾)--具有虚拟内存,获取物理--> virtio(向主机发送物理地址)---将物理地址映射到主机虚拟内存---> 主机 物理内存是预先分配的。是否有一种方法可以在主机上预先分配未映射的虚拟内存,以便它不必搜索可用的虚拟地址空间? 如果缓冲区相当大,这是合理的设计考虑吗? 我想要的最终结果是一个虚拟地址空间池来映射接收到的缓冲区。 每次作业后,我都要取消映射它们并将它们发送回虚拟地址空间到池。要保留虚拟内存范围而不向其实际提交任何物理页,请将PROT\u NO

我有以下场景:
qemu kvm(来宾)--具有虚拟内存,获取物理-->
virtio(向主机发送物理地址)---将物理地址映射到主机虚拟内存--->
主机
物理内存是预先分配的。是否有一种方法可以在主机上预先分配未映射的虚拟内存,以便它不必搜索可用的虚拟地址空间?
如果缓冲区相当大,这是合理的设计考虑吗?
我想要的最终结果是一个虚拟地址空间池来映射接收到的缓冲区。

每次作业后,我都要取消映射它们并将它们发送回虚拟地址空间到池。

要保留虚拟内存范围而不向其实际提交任何物理页,请将
PROT\u NONE
作为保护参数传递到
mmap()
。稍后,您可以在该范围内使用
mprotect()
,以便在必要时使其可读/写-内核将在第一次访问时提交物理页面。完成后,您可以再次使用
mprotect()
将地址范围的保护状态重置回
PROT\u NONE

m。。。我的问题与内核空间有关,在这里我无法使用mmapy,那么您需要重新表述您的问题。Linux中的虚拟地址空间始终与用户空间进程相关联(通过
mm_struct
对象)。要将映射附加到它,需要分配一个
vm_area_struct
对象,填充它,然后执行类似
insert_vm_struct(mm,vma)
,其中
mm
指向进程的虚拟地址空间。当用户空间进程点击如此定义的虚拟地址范围时,回调将在内核端触发,这将允许您玩任何带有页面映射的游戏。