Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Управление памятью Выделение адресного пространства ядра

Выделение адресного пространства ядра

Система виртуальной памяти реализует набор примитивных функций для выделения и освобождения выровненных по границе страницы и округленных до размера страницы диапазонов виртуальной памяти, которые использует ядро. Эти диапазоны могут выделяться либо из главного отображения адресов ядра, либо из подотображения. Процедуры выделения принимают в качестве параметров отображение и размер, но не принимают адрес. Таким образом, нельзя выбирать определенные адреса внутри отображения. Для получения выгружаемых и невыгружаемых диапазонов существуют различные процедуры выделения.

Невыгружаемый, или переданный (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(), поскольку она пробуждает любой процесс, ожидающий адресное пространство в указанном отображении.


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 55 гостей онлайн

Реклама на сайте:

Однопользователькие браузерные онлайн игры.

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

дизтопливо для отопления, дизельное топливо.