Система виртуальной памяти реализует набор примитивных функций для выделения и освобождения выровненных по границе страницы и округленных до размера страницы диапазонов виртуальной памяти, которые использует ядро. Эти диапазоны могут выделяться либо из главного отображения адресов ядра, либо из подотображения. Процедуры выделения принимают в качестве параметров отображение и размер, но не принимают адрес. Таким образом, нельзя выбирать определенные адреса внутри отображения. Для получения выгружаемых и невыгружаемых диапазонов существуют различные процедуры выделения.
Невыгружаемый, или переданный (wired), диапазон имеет физическую память, назначенную во время вызова, и эта память не может быть замещена демоном удаления страниц. Переданные страницы никогда не должны вызывать отказ страницы, который может привести к блокированию операции. Переданная память выделяется с помощью kmem_alloc() и kmemjnalloc(). kmemjjlloc() возвращает память, заполненную нулями, и может блокироваться, если для выполнения запроса доступно недостаточно физической памяти. Она вернет ошибку, лишь если в указанном отображении нет доступного адресного пространства. kmemmalloc() является разновидностью kmemalloc(), использующейся лишь общим распределителем, malloc(), описанным в следующем подразделе. Эта процедура имеет неблокирующий вариант, который защищает вызывающего от неосторожного блокирования структур данных ядра; он завершится неудачей, если для заполнения запрошенного диапазона недоступно достаточно физической памяти. Неблокирующий вариант выделяет память в ходе прерывания и во время других критических разделов кода. Вообще, переданная память должна выделяться через распределитель ядра общего назначения. kmemalloc() должна использоваться лишь для выделения памяти из различных подотображений ядра.
Выгружаемая виртуальная память может выделяться с помощью kmemallocjpageable() и kmemjalloc_wait(). Выгружаемый диапазон имеет физическую память, выделенную по требованию, и эта память может быть переписана демоном удаления страницы на запоминающее устройство как часть обычной политики замещения демона, kmemallocjpageable() возвратит ошибку, если для нужного выделения доступно недостаточно адресного пространства; ктет alloc jvait() будет заблокирована до тех пор, пока пространство не станет доступным. В настоящее время страничная память ядра используется лишь для временного хранения аргументов exec.
ktet_free() освобождает переданную память ядра и выгружаемую память, выделенную с помощью ktet allocjageable(). ktet_free_wakeup() должна использоваться с ktet allocjwait(), поскольку она пробуждает любой процесс, ожидающий адресное пространство в указанном отображении.
- 24/10/2010 07:08 - Malloc ядра
- 24/10/2010 06:47 - Индивидуальные моментальные снимки
- 23/10/2010 02:20 - Страничная подкачка
- 22/10/2010 23:00 - Пейджер подкачки
- 22/10/2010 12:25 - Сворачивание теневых цепочек
- 21/10/2010 20:16 - Индивидуальное отображение
- 20/10/2010 14:11 - Пейджер физической памяти
- 20/10/2010 10:09 - Отображения и подотображения ядра
- 19/10/2010 09:38 - Пейджер устройств
- 18/10/2010 22:14 - Управление памятью ядра