在我的研究项目中,我必须在内核模块内保留一个大的虚拟内存地址空间并处理对该区域的内存访问(在 64 位系统中)。我修改do_page_fault
了arch/x86/mm/fault.c中的函数,以便在 TLB 中没有页面映射记录时可以处理页面错误。
在我的项目中,保留的虚拟地址空间比物理可用内存大得多。例如,假设我们有 4GB 的可用内存空间。在我的内核模块中,我有 16GB 的地址空间,可以通过加载/存储指令访问。我想将一个 4KB 的页面压缩成 1KB 并将 16GB 的可压缩数据保存到 4GB 内存中;一旦发生页面错误,它会解压相应的页面并将其复制到页面缓存中。
我尝试过诸如kmalloc
and之类的内存分配函数vmalloc
,但它们实际上是在分配内存,而我只需要通过调用 [decompression] 函数进行一些非一对一的虚拟地址映射。我怎样才能做到这一点?