Linux kernel 我可以在内核模块中的指定物理地址分配内存页吗?

Linux kernel 我可以在内核模块中的指定物理地址分配内存页吗?,linux-kernel,memory-management,device-driver,kernel-module,qemu,Linux Kernel,Memory Management,Device Driver,Kernel Module,Qemu,我正在客户操作系统中编写一个内核模块,该模块将使用KVM在虚拟机上运行。这里我想在一个特定的物理地址上创建一个内存页。kmalloc()为我提供内存,但位于操作系统选择的物理地址 背景:我正在qemu中编写一种设备仿真技术,当来宾与设备通信时,它不会退出(例如,在I/O映射设备和端口映射设备中退出)。基本思想如下:来宾设备驱动程序将写入特定(来宾)物理内存地址。qemu进程中的线程将持续轮询它,以检查新数据(通过一些状态位等)。并将在不导致退出的情况下采取相应的行动。由于没有(现有的)方式让来宾

我正在客户操作系统中编写一个内核模块,该模块将使用KVM在虚拟机上运行。这里我想在一个特定的物理地址上创建一个内存页。kmalloc()为我提供内存,但位于操作系统选择的物理地址


背景:我正在qemu中编写一种设备仿真技术,当来宾与设备通信时,它不会退出(例如,在I/O映射设备和端口映射设备中退出)。基本思想如下:来宾设备驱动程序将写入特定(来宾)物理内存地址。qemu进程中的线程将持续轮询它,以检查新数据(通过一些状态位等)。并将在不导致退出的情况下采取相应的行动。由于没有(现有的)方式让来宾可以告诉主机设备驱动程序正在使用什么地址,所以我希望为它分配一个预先指定的内存页

您不能在特定地址分配内存,但是,您可以使用
reserve\u bootmem()
在启动时保留某些物理地址。在启动初期调用
reserve_bootmem()
(当然,它需要一个修改过的内核)将确保保留的内存不会传递给好友系统(即
alloc_pages()
和更高级别的好友-
kmalloc()
),您将能够将该内存用于任何目的。

听起来您应该从另一个角度攻击它,在QEMU BIOS引导时传递给来宾内核的内存映射中保留一个物理内存范围。

这是一种方法。它是一个DMA,由qemu硬件模拟。来宾操作系统中有设备驱动程序,将通过“PCI”或IO端口设置DMA,qemu中有模拟硬件设备(如hdd、网络)。@osgx是,但来宾设备驱动程序每次访问内存位置都会导致qemu退出。我正在尝试最小化这些退出以提高设备仿真性能这似乎是一个很有希望的想法。我将努力实现这一点。(然而,我希望我不必修改内核,这样就可以使用未修改的操作系统)也许可以依赖于固定地址,您仍然可以调用
kmalloc()
,并以某种方式将相应的物理地址传递给主机。我想您确实有一些与主机代码的通信通道。是的,我可以编写另一个可以与主机通信的简单内核模块。我希望我可以避免这样做。目前,我只做这件事