2014-01-17 2 views
0

Я проходил процесс пакетной передачи и приема пакетов в последнем ядре Linux. Я вижу, что в skb есть структура, где она поддерживает «линейные» данные, а также «выгружаемые» данные.DMA данных в буфере сокета (skb) в linux

Он имеет отдельную структуру под названием skb_shared_info для представления фрагментов страницы.

Теперь я сомневаюсь, каким образом устройство DMA будет содержать все содержимое пакета? Разве это не будет разбросано по памяти?

Благодаря чида

+0

Именно здесь играет роль [IOMMU] (http://en.wikipedia.org/wiki/IOMMU). – 0x90

+1

@ 0x90 Спасибо за подсказку. Если бы вы могли предоставить его в качестве ответа, я согласен с ним. – CHID

ответ

2

Это зависит от возможностей сетевого аппаратного обеспечения. Большинство «современных» сетевых адаптеров могут собирать/разбрасывать DMA и обрабатывать пакет в несколько несмежных буферов, но сетевой стек ядра Linux будет давать только skb с нелинейными данными в драйвер/netdev, если установлен NETIF_F_SG (с указанием устройство может обрабатывать разброс/сбор). Если драйвер устройства устанавливает NETIF_F_SG, он сообщает стеку, что он может обрабатывать несколько физических буферов для каждого пакета.

+0

Спасибо! Так что, если устройство не поддерживает сбор рассеяния, стек создает отдельные СКБ до тех пор, пока он не будет соответствовать длине пакета? – CHID

+0

Он создаст один skb для каждого пакета, со всеми данными в линейной части. – Roland

+0

Спасибо, Роланд. Это делает вещи понятными – CHID

Смежные вопросы