LINUX.ORG.RU

Если ты ее вручную не добавишь ни в один список и не создашь трансляцию в userspace, то она по определению не может быть вытеснена.

Murr ★★
()
Ответ на: комментарий от Murr

В 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);

Murr ★★
()
Ответ на: комментарий от Murr

На диск страницы попадают примерно следующим образом:

1) есть демон, который бегает по адресным пространствам ПРОЦЕССОВ, выделяет swap трансляцию для страниц (которые не имеют mapping) и перемещает её в swap_cache, когда счетчик страницы доходит до 0 (или 1 или 2) и страница не является грязной, то она просто освобождается.

2) есть демон, который пытается время от времени манипулировать списками active и inactive, записывать страницы и освобождать, если они не используются.

Поскольку демон никогда не бегает по пространству ядра, то выделенная в ядре страничка никогда не освободится и не потеряет виртуальной трансляции в ядре.

Murr ★★
()
Ответ на: комментарий от LONGOBARD

>Есть функция mlock() и она блокирует адресное просторанство, т.е. оно не будет выгружено в своп.

Спасибо, "мне уже сообщили" (c) ;) А автору исходного сообщения по постановке задачи не нужно.

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.