4

我正在客户操作系统中编写一个内核模块,它将在使用 KVM 的虚拟机上运行。在这里,我想在特定的物理地址处分配一个内存页。kmalloc() 给了我内存,但在操作系统选择的物理地址上。

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

4

2 回答 2

6

您不能在特定地址分配内存,但是,您可以在启动时使用reserve_bootmem(). 在启动时提前调用reserve_bootmem()(当然,它需要修改内核)将确保保留的内存不会传递给伙伴系统(即alloc_pages()和更高级别的朋友 - kmalloc()),并且您将能够将该内存用于任何目的.

于 2011-11-09T22:37:08.930 回答
0

听起来你应该从另一边攻击这个,通过在内存映射中保留一个物理内存范围,QEMU BIOS 在启动时传递给来宾内核。

于 2011-11-13T11:54:37.957 回答