Сетевой обзор расширений ядра
Сетевое расширение ядра (NKE) является термином, использованным для описания любого расширения ядра OS X, взаимодействующего с сетевым стеком. Это - отдельно скомпилированный модуль (произведенный, например, XCode с помощью Расширения ядра (KEXT) тип проекта).
Загрузка расширения ядра обрабатывается kextload
утилита командной строки, добавляющая NKE к рабочему ядру OS X как часть адресного пространства ядра. В конечном счете система обеспечит автоматические механизмы для загрузки расширений. В настоящее время автоматическая загрузка возможна только для Набора I/O KEXTs и другой KEXTs, от которого они зависят.
Как расширение ядра, NKE обеспечивает инициализацию и подпрограммы завершения, которые вызывает ядро, когда NKE загружен или разгружен. Дескрипторы подпрограммы инициализации, инициализирующие локальные структуры данных и регистрирующие средства управления, фильтры и интерфейсы. Точно так же подпрограмма завершения должна освободить любую выделенную память и не зарегистрировать расширение вместе с любыми средствами управления ядром, связанными с ним.
Реализация NKE
Анализ 4.4BSD сетевая архитектура
OS X основывается 4.4BSD операционная система UNIX. Следующие структуры управляют 4.4BSD сетевая архитектура:
socket
структура, который использование ядра отслеживать сокеты.socket
на структуру ссылаются дескрипторы файлов от непривилегированного режима.domain
структура, описывающая семейства протокола.protosw
структура, описывающая обработчиков протокола. (Обработчик протокола является реализацией определенного протокола в семействе протокола.)ifnet
структура, описывающая сетевое устройство и содержащая указатели на подпрограммы драйвера устройства интерфейса.
Ни одна из этих структур не используется унифицированно повсюду 4.4BSD сетевая инфраструктура. Вместо этого каждая структура используется на определенном уровне, как показано на рисунке 1-1.
В OS X сами структуры скрыты позади непрозрачных типов (или в некоторых случаях, целочисленные идентификаторы). Однако с концептуальной точки зрения, эквивалентные структуры данных существуют и доступны через функции средства доступа. Архитектура OS X получена в итоге на рисунке 1-2.
socket
структура используется для управления сокетом. domain
, protosw
, и ifnet
структуры используются для управления доставкой пакетов к и от сетевого устройства.
Сетевые механизмы KPI
OS X, начинающийся в версии 10.4, поддерживает несколько связанных с сетями интерфейсов программирования ядра (KPIs). Этот механизм KPI состоит из непрозрачных типов данных и функций для управления базовыми структурами данных. В отличие от прямого доступа структуры, используемого в предыдущих версиях, механизм KPI допускает поддержание совместимости на уровне двоичных кодов через версии ОС.
Каждые из сетей механизмы KPI выполняют определенную задачу. Базовые сети механизмы KPI:
KPI фильтра сокета, разрешающий KEXT фильтровать входящий или исходящий трафик на данном сокете, в зависимости от того, как они присоединяются. Фильтры сокета могут также отфильтровать внеполосную коммуникацию, такую как вызовы к
setsockopt
илиbind
. Получающиеся фильтры находятся между уровнем сокета и протоколом.IP фильтрует KPI, позволяющий KEXT выполнить пакетную фильтрацию TCP/IP на полных (нефрагментированных) кадрах IP. Получающиеся фильтры вызываются каждый раз, когда пакет TCP/IP вводит уровень обработчика протокола (обычно от канального уровня после того, как пакет повторно собран), и снова каждый раз, когда пакет оставляет уровень обработчика протокола (обычно возвращение к канальному уровню).
Интерфейсный KPI фильтра, позволяющий KEXT добавлять фильтр к определенному сетевому интерфейсу. Эти интерфейсные фильтры (ранее известный как канал передачи данных NKEs) могут пассивно наблюдать трафик (независимо от типа пакета), когда это течет в и из системы. Они могут также изменить трафик (например, шифруя или выполняя преобразование адресов). Они по существу действуют как фильтры между стеком протоколов и устройством.
Соедините интерфейсом с KPIs, позволяющими KEXT регистрировать сетевой интерфейс, протоколы присоединения к интерфейсам, собрать информацию об интерфейсах и отправить пакеты в интерфейсе. Создаваемое использование виртуального устройства этого механизма определяет много специфичных для носителей обратных вызовов поддержки (демультиплексирование, структурирование и предварительные функции вывода, такие как ARP). Виртуальные устройства могут быть записаны полностью с помощью Интерфейсного механизма KPI.
KPIs водопроводчика протокола, позволяющие KEXT регистрировать код для обработки существующих протоколов на новых интерфейсных типах.
Рисунок 1-3 показывает архитектуру NKE подробно.
Отслеживание использование KEXT
Самый важный аспект удаления сетевого фильтра, псевдоинтерфейса и подобных компонентов гарантирует, что все системные ресурсы, выделенные KEXT, возвращаются к системе.
Для поддержки динамической загрузки и разгрузки KEXTs в OS X ядро отслеживает использование зарегистрированных фильтров и подобных компонентов другими частями системы. Однако, в то время как это защищает от повисших зависимостей от Вашего KEXT, Ваш KEXT должен все еще выпустить любые структуры данных, которые это сохранило откуда-либо. KEXT должен отследить свое использование ресурсов, таких как структуры сокета и mbufs так, чтобы подпрограмма завершения KEXT могла устранить ссылки и возвратить системные ресурсы.
Как правило, для фильтров сокета, большинство ресурсов будет определенным для данного сокета. Однако существует механизм, предусмотрел выделение на фильтр. Когда сетевой стек избавится от всех экземпляров Вашего фильтра, он вызовет фильтр sf_unregistered_func
обратный вызов. В то время Ваш фильтр должен освободить любые ресурсы, которые являются глобальной переменной к фильтру.
Когда сетевой стек закончится с определенным экземпляром Вашего фильтра, он вызовет sf_detach_func
, iff_detach_func
, или ipf_detach_func
обратный вызов, соответственно. Ваше расширение, которое большинство не разгружает, пока оно не получило отсоединенные или незарегистрированные обратные вызовы для каждого фильтра или соединяет интерфейсом с этим, это зарегистрировалось. Далее, это должно отследить любые ресурсы, которые это использует, и освободите те ресурсы перед разгрузкой.
Ресурсы, которые не на интерфейс или на фильтр, могут быть выделены и освобождены в запуске KEXT и остановить подпрограммы.
Специфичные для экземпляра персистентные данные
Сети механизм KPI предоставляют некоторую элементарную поддержку для отслеживания памяти и данных, связанных с определенным экземпляром фильтров. Когда фильтр присоединяется (независимо от типа фильтра), cookie присваивается тому определенному экземпляру. В случае фильтров сокета обратный вызов присоединения возвращает это значение. Для других типов фильтра значение передается в функцию присоединения вызывающей стороной. В то время как этот cookie может содержать произвольные KEXT-специфичные данные, он обычно используется для содержания указателя на структуру данных по Вашему выбору.
Значение cookie будет передано как параметр каждый раз, когда любая из функций Вашего фильтра впоследствии вызвана на приведенном примере фильтра. Можно тогда бросить значение к указателю на надлежащую структуру и использовать это для восстановления информации, хранившей там.
Насколько сетевой стек затронут, cookie является черным квадратом, только имеющим значение в контексте Вашего расширения ядра. Это не попытается управлять cookie всегда, и что еще более важно, если это будет содержать указатель на динамично выделенный объект, то Ваш KEXT, как ожидают, будет управлять освобождением базового объекта данных после того, как будет отсоединен экземпляр фильтра.
Информация о зависимостях KEXT
Зависимости для основанного на KPI KEXTs отличаются от используемых для pre-KPI KEXTs в предыдущих версиях OS X.
Зависимости KPI для OS X v10.4:
Идентификатор пакета | Версия | Описание |
---|---|---|
com.apple.kpi.bsd | 8.0.0 | BSD APIs |
com.apple.kpi.iokit | 8.0.0 | Набор I/O APIs |
com.apple.kpi.libkern | 8.0.0 | Граница пользователя/Ядра Пересекающийся APIs |
com.apple.kpi.mach | 8.0.0 | Мах APIs |
com.apple.kpi.unsupported | 8.0.0 | Неподдерживаемый и устаревший APIs |
Для версий зависимости для других выпусков OS X посмотрите, что Расширение ядра Программирует Темы.