В Linux вся оперативная память отображается на ZONE_NORMAL(на PC - первые мегабайт 800) и ZONE_HIGHMEM (на PC - окошко в 200 Мб, в котором создаются трансляции на память выше 800 Мб). Если ты делаешь kmalloc, то тебе выделяется страничка - пока ты её не отпустишь, она будет принадлежать тебе, причем возможны два случая:
1) тебе выделят память в ZONE_NORMAL, тогда пока ты ей не сделаешь kfree явно, то ты ВСЕГДА сможешь к ней обращаться по виртуальному адресу page_address(page) - её размещение в виртуальной памяти ядра перманентно.
2) тебе выделят память в ZONE_HIGHMEM, тогда кроме того, что ты получил память - когда ты захочешь записать в конкретную страницу - тебе нужно создать для неё трансляцию в ZONE_HIGHMEM функцией kmap:
struct page * p = alloc_page(GFP_KERNEL);
char* virt_addr = kmap(p);
virt_addr[0]=1;
kunmap(p);
...
free_page(p);
На диск страницы попадают примерно следующим образом:
1) есть демон, который бегает по адресным пространствам ПРОЦЕССОВ, выделяет swap трансляцию для страниц (которые не имеют mapping) и перемещает её в swap_cache, когда счетчик страницы доходит до 0 (или 1 или 2) и страница не является грязной, то она просто освобождается.
2) есть демон, который пытается время от времени манипулировать списками active и inactive, записывать страницы и освобождать, если они не используются.
Поскольку демон никогда не бегает по пространству ядра, то выделенная в ядре страничка никогда не освободится и не потеряет виртуальной трансляции в ядре.