I'm a little confused about the whole page table bit, since (according to my limited knowledge) that would mean managing page attributes and playing nice with the MMU. Although I think I understand what you meant by the rest. I believe kmalloc internally uses the slab allocator to bunch up memory into the caches in order to minimize fragmentation. So re-purposing kmalloc for a different chunk of memory doesn't seem likely. I think what you want is genalloc, the general purpose allocator.
I've seen genalloc used around the kernel for more fine-grained allocations. Generally it seems that you create a pool, then add a chunk of memory to the pool, then make any number of allocations and frees, then free the pool. Of course, you need to find memory to add to the pool first, but it's up to you where that comes from or how you allocate it from the kernel.
Hope that helps. I didn't know about genalloc before you asked and I've been curious about other allocators after playing with kmem_cache.
Alex W