В чем разница между ISR, зарегистрированным через IDIOT, и «линией IRQ», зарегистрированной с использованием request_irqLinux

Ответить
Anonymous
 В чем разница между ISR, зарегистрированным через IDIOT, и «линией IRQ», зарегистрированной с использованием request_irq

Сообщение Anonymous »


Код ядра предполагает, что «схема вектора IRQ» никогда не меняется, но предлагает функцию под названием request_irq, которая предположительно добавляет «строку IRQ». Что такое линия IRQ в этом контексте?

В чем разница между ISR, зарегистрированным через IDT, и «строкой IRQ», зарегистрированной с помощью request_irq?

Вот первый абзац из настройки векторного макета IRQ (irq_vectors.h).

/* * Векторный макет IRQ в Linux. * * Имеется 256 записей IDT (на каждый процессор – каждая запись имеет размер 8 байт), которые могут * определяться Linux. Они используются процессором в качестве таблицы переходов, когда * данный вектор запускается - внешним процессором, внутренним процессором или * событие, вызванное программным обеспечением. * * Linux устанавливает адрес кода ядра, к которому каждая запись переходит на ранней стадии * bootup и никогда их не меняет. Это общая планировка * Записи IDT: * * Векторы 0...31: системные ловушки и исключения — жестко запрограммированные события. * Векторы 32...127: прерывания устройства * Вектор 128: устаревший интерфейс системных вызовов int80. * Векторы 129... LOCAL_TIMER_VECTOR-1 * Векторы LOCAL_TIMER_VECTOR...255: специальные прерывания * * 64-разрядная версия x86 имеет таблицы IDT для каждого процессора, 32-разрядная версия имеет одну общую таблицу IDT. * * В этом файле перечислено их точное расположение: */ Примечание: "Linux устанавливает адрес кода ядра, к которому каждая запись переходит на ранней стадии загрузки, и никогда его не меняет".

А вот reqeust_irq:

/* * request_threaded_irq — выделить линию прерывания * @irq: линия прерывания для выделения * @handler: Функция, вызываемая при возникновении IRQ. * Первичный обработчик многопоточных прерываний. * Если обработчик имеет значение NULL и thread_fn != NULL * установлен основной обработчик по умолчанию. * @thread_fn: функция, вызываемая из потока обработчика irq. * Если NULL, поток прерываний не создается. * (.......) * * Этот вызов выделяет ресурсы прерываний и разрешает * линия прерывания и обработка IRQ. С этой точки зрения * Вызов выполнен, ваша функция-обработчик может быть вызвана. С * ваша функция-обработчик должна очищать все прерывания на плате * поднимается, вы должны позаботиться об инициализации вашего оборудования * и настроить обработчик прерываний в правильном порядке. */ Который якобы предлагает добавить обработчик IRQ. Я думаю, они имеют в виду разные вещи, но не могу понять, что это за разные вещи.

Похоже, что request_irq влияет на /proc/interrupts, но это, похоже, не та таблица, упомянутая в начале. Используя request_irq, я мог легко переопределить обработчики исключений, такие как 0 (предположительно, исключение деления на ноль) и 0x80 (предположительно, устаревший системный вызов), без какого-либо воздействия на систему и без возможности их вызвать.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»