Шрифт:
Флаги типов указывают модификаторы операций и зон, которые необходимы для выполнения запросов определенных типов. В связи с этим, в коде ядра стараются использовать правильный флаг типа и не использовать больших наборов модификаторов. Это одновременно и проще и при этом меньше шансов ошибиться. В табл. 11.5 приведен список возможных флагов типов, а в табл. 11.6 показано, какие модификаторы соответствуют какому флагу.
Таблица 11.5. Флаги типов
Флаг | Описание |
---|---|
GFP_ATOMIC | Запрос на выделение памяти высокоприоритетный и в состояние ожидания переходить нельзя. Этот флаг предназначен для использования в обработчика: прерываний, нижних половин и в других ситуациях, когда нельзя переходить в состояние ожидания |
GFP_NOIO | Запрос на выделение памяти может блокироваться, но при его выполнении нельзя выполнять операции дискового ввода-вывода. Этот флаг предназначен для использования в коде блочного ввода-вывода, когда нельзя инициировать новые операции ввода-вывода |
GFP_NOFS | Запрос на выделение памяти может блокироваться и выполнять дисковые операции ввода-вывода, но запрещено выполнять операции, связанные с файловыми системами. Этот флаг предназначен для использования в коде файловых систем, когда нельзя начинать выполнение новых файловых операций |
GFP_KERNEL | Обычный запрос на выделение памяти, который может блокироваться. Этот флаг предназначен для использования в коде, который выполняется в контексте процесса, когда безопасно переходить в состояние ожидания |
GFP_USER | Обычный запрос на выделение памяти, который может блокироваться. Этот флаг используется для выделения памяти процессам пространства пользователя |
GFP_HIGHUSER | Запрос на выделение памяти из зоны ZONE_HIGHMEM , который может блокироваться. Этот флаг используется для выделения памяти процессам пространства пользователя |
GFP_DMA | Запрос на выделение памяти из зоны ZONE_DMA . Драйверам устройств, которым нужна память для выполнения операций по ПДП, необходимо использовать этот флаг обычно в комбинации с одним из описанных выше флагов |
Таблица 11.6. Список модификаторов, соответствующих каждому флагу типа
Флаг | Модификаторы |
---|---|
GFP_ATOMIC | __GFP_HIGH |
GFP_NOIO | __GFP_WAIT |
GFP_NOFS | (__GFP_WAIT | __GFP_IO) |
GFP_KERNEL | (__GFP_WAIT | __GFP_IO | __GFP_FS) |
GFP_USER | (__GFP_WAIT | __GFP_IO | __GFP_FS) |
GFP_HIGHUSER | (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HIGHMEM) |
GFP_DMA | __GFP_DMA |
Рассмотрим наиболее часто используемые флаги и для чего они могут быть нужны. Подавляющее большинство операций выделения памяти в ядре используют флаг
Можно сказать, что свойства флага
По своим свойствам между рассмотренными флагами находятся флаги
Флаг
В подавляющем большинстве случаев при разработке кода вам будет необходимо использовать флаги
Таблица 11.7. Какой флаг и когда необходимо использовать
Ситуация | Решение |
---|---|
Контекст процесса, можно переходить в состояние ожидания | Используется флаг GFP_KERNEL |
Контекст процесса, нельзя переходить в состояние ожидания | Используется флаг GFP_ATOMIC или память выделяется с использованием флага GFP_KERNEL но в более ранний или поздний момент, когда можно переходить в состояние ожидания |
Обработчик прерывания | Используется флаг GFP_ATOMIC |
Обработка нижней половины | Используется флаг GFP_ATOMIC |
Необходима память для выполнения операций ПДП, можно переходить в состояние ожидания | Используются флаги (GFP_DMA | GFP_KERNEL) |
Необходима память для выполнения операций ПДП, нельзя переходить в состояние ожидания | Используются флаги (GFP_DMA | GFP_ATOMIC) или выделение выполняется в более поздний или более ранний момент времени |