1

In my research project, I have to reserve a large virtual memory address space inside a kernel module and handle memory accesses to that area (in a 64-bit system). I have modified do_page_fault function in arch/x86/mm/fault.c so that I can handle page faults when there is no page mapping record in TLB.

In my project, the reserved virtual address space is much larger than physically available memory. For example, let's say we have 4GB available memory space. Inside my kernel module, I what to have 16GB address space which is accessible by load/store instructions. I want to compress a 4KB page into 1KB and maintain 16GB compressible data into 4GB memory; once a page fault occurs, it'll decompress the corresponding page and copy it into the page cache.

I've tried memory allocate functions such as kmalloc and vmalloc, but they literally allocate memory while I only need some non-one-to-one virtual address mapping via calling a [decompression] function. How can I do that?

  • I guess that virtual memory addresses are assigned through _memory zones_ in memory initialization code in `mm/init.c` and you can introduce your own zone by biting a chunk from `ZONE_HIGHMEM`. – myaut Oct 15 '17 at 09:29
  • How about `kmap_atomic()`? – user2029269 Oct 16 '17 at 21:51

0 Answers0