我在客户操作系统中编写内核模块,该模块将使用KVM在虚拟机上运行。在这里,我想在特定的物理地址上创建一个内存页面。 kmalloc()给了我记忆但是在OS选择的物理地址。
背景:我正在qemu中编写一种设备仿真技术,当guest虚拟机与设备通信时它不会退出(例如,它在I / O映射以及端口映射设备中退出)。基本思想如下:来宾设备驱动程序将写入特定(客户)物理内存地址。 qemu进程中的一个线程将连续轮询它以检查新数据(通过一些状态位等)。并将采取相应的行动,而不会导致退出。由于客户端没有(现有)方式告诉主机设备驱动程序正在使用哪个地址,因此我希望为其分配预先指定的内存页面。
答案 0 :(得分:6)
您无法在特定地址分配内存,但是,您可以使用reserve_bootmem()
在启动时保留某些物理地址。在启动时尽早调用reserve_bootmem()
(当然,它需要修改内核)将确保保留的内存不会传递给伙伴系统(即alloc_pages()
和更高级别的朋友 - {{1} }),您将能够将该内存用于任何目的。
答案 1 :(得分:0)
听起来你应该从另一方面攻击这个,通过在内存映射中保留物理内存范围,QEMU BIOS在启动时传递给来宾内核。