Сходство с прерываниями Linux
У нас есть HP DL980 под управлением SuSE Linux Enterprise Server 11 sp2.
На машине размещена карта цифрового ввода-вывода PCIe, которая используется для отправки тактового сигнала для синхронизации с другими машинами.
Если мы выполняем top, один из процессов показывается с помощью команды [irq/28-pci7230], а top показывает, что этот процесс выполняется на CPU8. Мы знаем, что pci7230 - это цифровая плата ввода-вывода. Если я затем cat /proc/interrupts, это показывает все прерывания на CPU0.
Кто-нибудь может объяснить, что здесь происходит? У меня сложилось впечатление, что запись сверху показывает, что прерывание обрабатывается CPU8, но /proc/interrupts, по- видимому, предлагает иное.
1 ответ
Вы путаете верхнюю половину прерывания с нижней половиной. Совершенно нормально, что верхняя половина прерывания работает на ядре, отличном от нижней половины. Когда происходит аппаратное прерывание, вы находитесь в каком-либо контексте, который был запущен. Очень важно, чтобы вы освободили этот контекст как можно быстрее, чтобы не захватывать случайную, возможно, важную работу.
"Linux (наряду со многими другими системами) решает эту проблему, разбивая обработчик прерываний на две половины. Так называемая верхняя половина - это процедура, которая на самом деле отвечает на прерывание - та, которую вы регистрируете с помощью request_irq. Нижняя половина - это процедура это запланировано верхней половиной, чтобы быть выполненным позже, в более безопасное время. Большая разница между обработчиком верхней половины и нижней половиной состоит в том, что все прерывания включены во время выполнения нижней половины - поэтому это работает на более безопасном время. В типичном сценарии верхняя половина сохраняет данные устройства в буфере для конкретного устройства, планирует его нижнюю половину и завершается: эта операция выполняется очень быстро. Затем нижняя половина выполняет любую другую необходимую работу, такую как процессы пробуждения, запуск другой операции ввода-вывода и т. д. Эта настройка позволяет верхней половине обслуживать новое прерывание, пока нижняя половина все еще работает ". - Верхняя и нижняя половинки
Сами прерывания не запланированы - прерывание прибывает, когда оно прибывает. [irq/28-pci7230]
поток ядра запланирован, чтобы сделать "реальную работу".