Что значит код прерывания для обработки пакетов в 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 - который я кратко опишу).
- Пакеты сначала принимаются картой. Когда интерфейс получает "данные поступили с прерыванием", он отключает прерывание и говорит ядру начать опрос интерфейса.
- Затем, когда пакет доступен, обработчик прерываний оставляет его в интерфейсе и вызывается метод netif_rx_schedule. Что приводит к тому, что метод опроса драйвера интерфейса будет вызван в будущем.
- затем он переходит на сетевой уровень и, наконец (но не так коротко, как я описал), переходит в пространство пользователя, и пользователь уведомляется о данных, доступных для события чтения, которое я не могу назвать прерыванием.
Я рекомендую вам прочитать следующую статью:
Сетевое ядро Linux ( http://www.ecsl.cs.sunysb.edu/elibrary/linux/network/LinuxKernel.pdf)
Я думаю, что это способ работы сетевых интерфейсов с поддержкой DMA (мастеринг шин) с драйвером NAPI:
Когда приходят пакет (ы), буферы сокетов уже распределены и сопоставлены с буфером памяти DMA, и DMA поставлен на охрану.
- Пакет передается из NIC в Socket Buffer через DMA
- NIC вызывает аппаратное прерывание, когда выполняется передача DMA.
- Аппаратный обработчик прерываний планирует программное прерывание приема пакетов (SOFTIRQ)
- SOFTIRQ вызывает опрос NAPI () для дальнейшей обработки.
- NAPI poll () обрабатывает пакеты в очереди DMA-буфера и передает их верхним уровням как
sk_buff
и инициализирует новые буферы DMA. если все пакеты (квота) обработаны, IRQ включается, и NAPI предписывается прекратить опрос.