Что значит код прерывания для обработки пакетов в TCP/IP?

Я использую TCP/IP через Ethernet 10 Гбит / с в Linux x86_64.

Но что происходит, когда прерывание происходит в одном из CPU-Core?

Это правда, что происходит:

  • Код прерывания вычисляет контрольную сумму IP-пакета
  • код прерывания копирует данные из буфера пространства ядра в требуемый сокет-буфер
  • Код прерывания копирует данные из буфера на Ethernet-карте в буфер в пространстве ядра (или это происходит до того, как генерируется прерывание с использованием DMA-контроллера в Ethernet, и инициируется ли это Ethernet-картой?)

1 ответ

Решение

Ваш вопрос - это сочетание аппаратного обеспечения, стека протоколов и пространства пользователя.

Код прерывания вычисляет контрольную сумму IP-пакета

эта часть - протоколы - я думаю, что где-то здесь net/ipv4/ip_input.c

код прерывания копирует данные из буфера пространства ядра в требуемый сокет-буфер

смесь прото и пользовательского пространства, например здесь net/ipv4/tcp_input.c

Код прерывания копирует данные из буфера на Ethernet-карте в буфер в пространстве ядра (или это происходит до того, как генерируется прерывание с использованием DMA-контроллера в Ethernet, и инициируется ли это Ethernet-картой?)

это аппаратное обеспечение, например, драйверы /net/8139cp.c

Далее - я думаю, вы неправильно понимаете термин "прерывание" - существуют аппаратные прерывания и программные прерывания. Единственное аппаратное прерывание здесь - это прерывания rx/tx от контроллера Ethernet.

Не полный ответ на ваш вопрос:

Прежде всего, можно разделить сеть на две части - действующие протоколы (каталог net / ipv4) и часть, которая реализует различное сетевое оборудование (drivers / net).

Не все драйверы аппаратного обеспечения реализуют технику управления прерываниями. Некоторые драйверы для адаптера с высокой пропускной способностью используют метод опроса (интерфейс NAPI - который я кратко опишу).

  1. Пакеты сначала принимаются картой. Когда интерфейс получает "данные поступили с прерыванием", он отключает прерывание и говорит ядру начать опрос интерфейса.
  2. Затем, когда пакет доступен, обработчик прерываний оставляет его в интерфейсе и вызывается метод netif_rx_schedule. Что приводит к тому, что метод опроса драйвера интерфейса будет вызван в будущем.
  3. затем он переходит на сетевой уровень и, наконец (но не так коротко, как я описал), переходит в пространство пользователя, и пользователь уведомляется о данных, доступных для события чтения, которое я не могу назвать прерыванием.

Я рекомендую вам прочитать следующую статью:

Сетевое ядро ​​Linux ( http://www.ecsl.cs.sunysb.edu/elibrary/linux/network/LinuxKernel.pdf)

Я думаю, что это способ работы сетевых интерфейсов с поддержкой DMA (мастеринг шин) с драйвером NAPI:

Когда приходят пакет (ы), буферы сокетов уже распределены и сопоставлены с буфером памяти DMA, и DMA поставлен на охрану.

  1. Пакет передается из NIC в Socket Buffer через DMA
  2. NIC вызывает аппаратное прерывание, когда выполняется передача DMA.
  3. Аппаратный обработчик прерываний планирует программное прерывание приема пакетов (SOFTIRQ)
  4. SOFTIRQ вызывает опрос NAPI () для дальнейшей обработки.
  5. NAPI poll () обрабатывает пакеты в очереди DMA-буфера и передает их верхним уровням как sk_buff и инициализирует новые буферы DMA. если все пакеты (квота) обработаны, IRQ включается, и NAPI предписывается прекратить опрос.
Другие вопросы по тегам