Сетевой обзор расширений ядра

Сетевое расширение ядра (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.

Рисунок 1-1  , традиционный 4.4BSD архитектура сетевых соединений
Traditional 4.4BSD Networking Architecture

В OS X сами структуры скрыты позади непрозрачных типов (или в некоторых случаях, целочисленные идентификаторы). Однако с концептуальной точки зрения, эквивалентные структуры данных существуют и доступны через функции средства доступа. Архитектура OS X получена в итоге на рисунке 1-2.

  Архитектура сетевых соединений OS X рисунка 1-2
OS X Networking Architecture

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 подробно.

Рисунок 1-3  архитектура NKE
NKE architecture

Отслеживание использование 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:

Таблица 1-1  зависимости KEXT

Идентификатор пакета

Версия

Описание

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 посмотрите, что Расширение ядра Программирует Темы.