Высокоуровневый путь, по которому проходит пакет от прибытия до приёмного буфера сокета выглядит так:
- Драйвер загружается и инициализируется.
- Пакет прибывает из сети в сетевую карту.
- Пакет копируется (посредством DMA) в кольцевой буфер памяти ядра.
- Генерируется аппаратное прерывание, чтобы система узнала о появлении пакета в памяти.
- Драйвер вызывает NAPI, чтобы начать цикл опроса (poll loop), если он ещё не начат.
- На каждом CPU системы работают процессы ksoftirqd. Они регистрируются во время загрузки. Эти процессы вытаскивают пакеты из кольцевого буфера с помощью вызова NAPI-функции poll, зарегистрированной драйвером устройства во время инициализации.
- Очищаются (unmapped) те области памяти в кольцевом буфере, в которые были записаны сетевые данные.
- Данные, отправленные напрямую в память (DMA), передаются для дальнейшей обработки на сетевой уровень в виде ‘skb’.
- Если включено управление пакетами, или если в сетевой карте есть несколько очередей приёма, то фреймы входящих сетевых данных распределяются по нескольким CPU системы.
- Фреймы сетевых данных передаются из очереди на уровни протоколов.
- Уровни протоколов обрабатывают данные.
- Данные добавляются в буферы приёма, прикреплённые к сокетам уровнями протоколов.
Взято с ресурса habrahabr.ru