Memory management 在内核模块中保留较大的虚拟地址空间

Memory management 在内核模块中保留较大的虚拟地址空间,memory-management,linux-kernel,kernel-module,virtual-address-space,page-caching,Memory Management,Linux Kernel,Kernel Module,Virtual Address Space,Page Caching,在我的研究项目中,我必须在内核模块内保留一个较大的虚拟内存地址空间,并处理对该区域的内存访问(在64位系统中)。我在中修改了do_page_fault函数,以便在TLB中没有页面映射记录时处理页面错误 在我的项目中,保留的虚拟地址空间远远大于物理可用内存。例如,假设我们有4GB的可用内存空间。在内核模块中,我希望有16GB的地址空间,可以通过加载/存储指令访问。我想将4KB的页面压缩成1KB,并将16GB的可压缩数据保存到4GB内存中;一旦出现页面错误,它将解压缩相应的页面并将其复制到页面缓存中

在我的研究项目中,我必须在内核模块内保留一个较大的虚拟内存地址空间,并处理对该区域的内存访问(在64位系统中)。我在中修改了
do_page_fault
函数,以便在TLB中没有页面映射记录时处理页面错误

在我的项目中,保留的虚拟地址空间远远大于物理可用内存。例如,假设我们有4GB的可用内存空间。在内核模块中,我希望有16GB的地址空间,可以通过加载/存储指令访问。我想将4KB的页面压缩成1KB,并将16GB的可压缩数据保存到4GB内存中;一旦出现页面错误,它将解压缩相应的页面并将其复制到页面缓存中


我尝试过内存分配函数,如
kmalloc
vmalloc
,但它们确实分配了内存,而我只需要通过调用[decompression]函数进行一些非一对一的虚拟地址映射。我该怎么做

我猜虚拟内存地址是通过
mm/init.c
中的内存初始化代码中的内存区域分配的,您可以通过从
zone\u HIGHMEM
咬一块来引入自己的区域?我猜虚拟内存地址是通过
mm/init.c
中的内存初始化代码中的内存区域分配的,您可以通过从
zone\u HIGHMEM
咬一块来引入您自己的区域。
kmap\u atomic()
怎么样?