Прочитайте malloc(9) - выделение памяти лишь
немного отличается от своего эквивалента, используемого в пространстве
пользовательских процессов (userland). Наиболее приметно то, что
malloc
() и free
()
принимают дополнительные параметры, которые описаны в странице
справочника.
Тип <<malloc_type>> необходимо объявить в секции деклараций файла с исходным кодом, например:
static MALLOC_DEFINE(M_GJOURNAL, "gjournal data", "GEOM_JOURNAL Data");
Для того, чтобы можно было использовать этот макрос,
необходимо включить следующие заголовочные файлы:
sys/param.h
,
sys/kernel.h
и
sys/malloc.h
Существует еще один механизм выделения памяти - UMA (Universal Memory Allocator), описанный в uma(9). Это специфический метод, преимущественно предназначенный для быстрого выделения памяти под списки, состоящие из элементов одинакового размера (например, динамические массивы структур).
Ознакомьтесь с queue(3) Во множестве случаев вам необходимо будет организовывать и управлять такой структурой данных, как списки. К счастью, эта структура данных реализована несколькими способами в виде макросов на Си, а также включена в систему. Наиболее гибкий и часто употребляемый тип списка - TAILQ. Этот тип списка также один из наиболее требовательных к памяти (его элементы - с двойными связями), а также - наиболее медленный (однако счет идет на несколько инструкций ЦПУ, поэтому последнее утверждение не следует воспринимать в всерьез).
Если важна скорость получения данных, то возьмите на вооружение tree(3) и hashinit(9).
Структура bio
используется для всех
операций ввода/вывода, касающихся GEOM. Она содержит
информацию о том, какое устройство ('поставщик geom') должно ответить
на запрос, тип запроса, смещение, длину и указатель на буфер,
а также набор <<определенных пользователем>> флагов и
полей
.
Важным моментом является то, что bio
обрабатываются асинхронно. Это значит, что во многих частях кода
нет аналога к read(2) и write(2) функциям из пространства
пользовательских процессов, которые не возвращают управление пока
не выполнится системный вызов. Скорее, по завершении обработки
запроса (или в случае ошибки при обработке) как извещение вызывается
определенная пользователем функция.
Асинхронная модель программирования в чем-то сложней,
нежели чаще используемая императивная модель, используемая в
пространстве пользовательских процессов; в любом случае, привыкание
займет некоторое время. В некоторых случаях могут быть использованы
вспомогательные функции g_write_data
() и
g_read_data
(), но далеко не
всегда. В частности, эти функции не могут использоваться
когда захвачен мьютекс; например, мьютекс GEOM-топологии или
внутренний мьютекс, удерживаемый в ходе выполнения
.start
() или .stop
().
Этот, и другие документы, могут быть скачаны с https://download.freebsd.org/ftp/doc/.
По вопросам, связанным с FreeBSD, прочитайте
документацию прежде чем писать в
<questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку
<doc@FreeBSD.org>.