Вот заявление, о котором я только что подумал. Может кто-нибудь сказать мне, правда ли и почему?
Заявление: поскольку USB-клавиатуры основаны на универсальном драйвере и архитектуре USB, которые имеют доступ только к более низким уровням IRQ, она не может предоставить клавиатуре доступ к IRQ с таким высоким приоритетом, как у другого (скажем, PS2) контроллера.
Означает ли это (если это правда), что клавиатуры USB будут иметь более низкий приоритет (с точки зрения доступности, а не скорости), чем клавиатуры, подключенные к другому типу порта (например, PS2)?
Возьмите, например, клавиатуру USB, сопоставленную с IRQ со средним приоритетом, в неисправной системе, которая застряла в другой программе прерывания со средним приоритетом. Из-за относительно одинакового приоритета события клавиатуры будут игнорироваться, и вы не сможете отправить Ctrl-Alt-del или любое другое экстренное нажатие клавиши. Если бы клавиатура имела более высокий приоритет, система могла бы ввести процедуру прерывания нажатия клавиши.
Или у контроллера USB достаточно диапазона IRQ (будь то непрерывный приоритет или нет), чтобы дать вашей клавиатуре необходимый приоритет (в основном чуть ниже сбоя питания)?
А как насчет виртуальных клавиатур, отображаемых через сетевое соединение в сеансе удаленного рабочего стола?
РЕДАКТИРОВАТЬ: Мой вопрос не столько о скорости (см. Комментарии): основной вопрос: есть ли у клавиатуры PS2 больше шансов говорить с процессором, который застрял где-то с приоритетом прерывания выше, чем USB и ниже, чем клавиатура?
Ответы:
Речь идет не о диапазоне IRQ, а о трех основных факторах:
В прошлом клавиатуры и мыши имели выделенный IRQ (IRQ1 для клавиатур, IRQ12 для мышей PS / 2).
Это означало, что когда клавиша была нажата, она имела почти прямую линию с процессором (через PIC; но все же, только один прыжок). Это позволило аппаратно обрабатывать события клавиатуры очень быстро, особенно с учетом IRQ1. (Конечно, это все о нормальном использовании клавиатуры и игнорирует строку сброса, которая идет от контроллера клавиатуры непосредственно к ЦПУ.)
С другой стороны, все USB-устройства используют одну и ту же шину и IRQ контроллера USB (который обычно является одним из управляющих IRQ, который используется совместно с другими устройствами, такими как сетевые карты, видеокарты и т. Д.). Таким образом, с клавиатурой USB события передаются с контроллера клавиатуры, через шину USB в хост-контроллер USB, оттуда на вторичный PIC, затем на главный PIC, а затем либо на драйверы в ОС, либо в BIOS. , затем на процессор. Кроме того, есть данные проверки ошибок, добавленные к данным, переданным через USB.
Другими словами, с клавиатурой USB происходит больше всего, чем с клавиатурой AT или PS / 2. Путь данных длиннее, данных больше, и, возможно, даже придется пройти через программное обеспечение . Несмотря на то, что пропускная способность USB достаточно велика, наличие других устройств на одном и том же порте вызывает коллизии и задержки (вы можете добавить концентратор, но все порты на нем все равно будут одним и тем же портом на контроллере). Таким образом, происходит гораздо больше ожидания.
Кроме того, наличие собственного (IRQ означало, что старая клавиатура могла прерывать обработку ЦП всякий раз, когда это было необходимо. С USB клавиатура не имеет такого механизма и может только отправлять некоторые данные и ждать / надеяться, что контроллер USB прервет ЦП в какой-то момент.
Виртуальные клавиатуры еще хуже, потому что они определенно проходят через программное обеспечение, которое, конечно, не может конкурировать с аппаратной линией.
Вот простая визуализация различия между клавиатурой AT или PS / 2 и клавиатурой USB:
источник
Ctrl+Alt+Del
don ' работают через аппаратную линию, а обрабатываются программно.Короткий ответ
Обе клавиатуры будут работать абсолютно одинаково для кода уровня пользователя. При написании драйверов устройств могут быть небольшие различия (от нано до микросекунд на современном ПК). Если система зависнет, обе клавиатуры не решат проблему. Перейти на полную перезагрузку.
Длинный ответ TL; DR;
Что такое прерывание?
Когда аппаратному обеспечению (или некоторой критической части внутреннего программного обеспечения ОС, например ядру) требуется служба процессора, оно запускает сообщение или прерывание , которое просит процессор отложить все, что он делает, и обработать этот запрос.
Как это устроено?
Когда аппаратное обеспечение генерирует прерывание (например, нажатие клавиши), этот запрос поступает в контроллер прерываний. Затем контроллер немедленно прерывает процессор на одной строке своего машинного кода (процессор все еще выполняет эту последнюю строку). Как только процессор готов обслуживать этот запрос, он запрашивает у контроллера прерываний запрос прерывания (IRQ) и подпрограмму обработки. Контроллер прерываний имеет внутреннюю структуру данных - Таблицу отправки прерываний, которая содержит указатель на подпрограмму, которая должна выполняться ЦП для определенного IRQ.
Все различные прерывания соответствуют четко определенному ограниченному уровню запроса прерывания (IRQL). Например, в системах x86 существует 32 IRQL, а в x64 и IA64 их на самом деле меньше - 16 IRQL. Очевидно, что аппаратных устройств и программных служб больше, чем IRQL, что означает, что все некоторые системные объекты будут использовать IRQL.
Таблица IRQL для x64
Более высокий IRQL (с большим числом) имеет более высокий приоритет. Все компоненты системы пытаются поддерживать текущий IRQL процессора на минимально возможном уровне - 0. Если происходит прерывание более высокого уровня, то текущий уровень IRQL процессора повышается, и прерывания с более низким уровнем не будут обрабатываться до тех пор, пока все прерывания с более высокими уровнями разрешены. IRQ может обрабатываться партиями, если планировщик IRQ может поставить в очередь несколько IRQ одного и того же уровня для выполнения процессором.
Какой смысл?
Все это было действительно хорошо разработано, чтобы отделить конечного пользователя от сложностей аппаратного обеспечения и создать универсальную архитектуру, которая может работать со многими типами аппаратного / программного обеспечения.
Код уровня пользователя (т.е. не уровня ядра) выполняется только тогда, когда процессор находится на уровне пассивного / низкого (0) IRQL. Дело в том, что вы можете обрабатывать событие нажатия клавиши в вашем приложении только после того, как все IRQL были обработаны. Поэтому для клавиатуры не имеет значения, какой IRQL назначен аппаратному прерыванию.
IRQL являются только абстракциями ОС и не установлены в камне . Соответствующие IRQ и IRQL хранятся в реестре Windows (например), и любой увлеченный пользователь может изменить их вручную.
Выводы
Цитаты из вопроса
Возможно, автор имел в виду более низкий IRQL вместо меньшего количества каналов IRQ . В любом случае, это не имеет значения, так как это не видно пользователю на любом современном ПК. Возможные отличия от нано- до микро- секунд уровня и они происходят только на уровне ядра. В обоих случаях код уровня пользователя блокируется ядром ОС.
Это не правда из-за способа разработки ОС. Если ОС чем-то занята и работает медленно, обе клавиатуры будут вести себя одинаково.
В этом случае система будет BSOD, процедуры обработки IRQ должны быть разработаны до определенного стандарта (например, они должны быть быстрыми, синхронными, неблокирующими и т. Д.). Любое отклонение от этого и у ядра будет BSOD.
Если система зависает, есть много вещей, которые могут пойти не так, но, скорее всего, нажатие клавиши IRQL будет обработано на уровне драйвера. Проблема в том, что оно не будет доставлено в приложение, которое подписалось на такое уведомление, так как ОС занята чем-то другим.
источник