18

Вот заявление, о котором я только что подумал. Может кто-нибудь сказать мне, правда ли и почему?

Заявление: поскольку USB-клавиатуры основаны на универсальном драйвере и архитектуре USB, которые имеют доступ только к более низким уровням IRQ, она не может предоставить клавиатуре доступ к IRQ с таким высоким приоритетом, как у другого контроллера (скажем, PS2).

Означает ли это (если это правда), что клавиатуры USB будут иметь более низкий приоритет (с точки зрения доступности, а не скорости), чем клавиатуры, подключенные к другому типу порта (например, PS2)?

Возьмем, к примеру, клавиатуру USB, сопоставленную с IRQ со средним приоритетом, в неисправной системе, которая застряла в другой программе прерывания со средним приоритетом. Из-за относительно одинакового приоритета события клавиатуры будут игнорироваться, и вы не сможете отправить Ctrl-Alt-del или любое другое экстренное нажатие клавиши. Если бы клавиатура имела более высокий приоритет, система могла бы ввести процедуру прерывания нажатия клавиши.

Или у контроллера USB достаточно диапазона IRQ (будь то непрерывный приоритет или нет), чтобы дать вашей клавиатуре необходимый приоритет (в основном чуть ниже сбоя питания)?

А как насчет виртуальных клавиатур, отображаемых через сетевое соединение в сеансе удаленного рабочего стола?

РЕДАКТИРОВАТЬ: Мой вопрос не столько о скорости (см. Комментарии): основной вопрос: есть ли у клавиатуры PS2 больше шансов говорить с процессором, который застрял где-то с приоритетом прерывания выше, чем USB и ниже, чем клавиатура?

2 ответа2

16

Речь идет не о диапазоне IRQ, а о трех основных факторах:

  1. Количество автобусов
  2. Количество данных
  3. Длина пути данных

В прошлом клавиатуры и мыши имели выделенный 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:

14

Короткий ответ

Обе клавиатуры будут работать абсолютно одинаково для кода уровня пользователя. При написании драйверов устройств могут быть небольшие различия (от нано до микросекунд на современном ПК). Если система зависнет, обе клавиатуры не решат проблему. Перейти на полную перезагрузку.


Длинный ответ TL; DR;

Что такое прерывание?

Когда аппаратному обеспечению (или некоторому критическому компоненту внутреннего программного обеспечения ОС, например ядру) требуется служба процессора, оно запускает сообщение или прерывание, которое просит процессор отложить все, что он делает, и обработать этот запрос.

Как это устроено?

Когда аппаратное обеспечение генерирует прерывание (например, нажатие клавиши), этот запрос поступает в контроллер прерываний. Затем контроллер немедленно прерывает процессор на одной строке своего машинного кода (процессор все еще выполняет эту последнюю строку). Когда процессор готов обслуживать этот запрос, он запрашивает у контроллера прерываний запрос прерывания (IRQ) и подпрограмму обработки. Контроллер прерываний имеет внутреннюю структуру данных - Таблицу отправки прерываний, которая содержит указатель на подпрограмму, которая должна выполняться ЦП для определенного IRQ.

Все различные прерывания соответствуют четко определенному ограниченному уровню запроса прерывания (IRQL). Например, в системах x86 существует 32 IRQL, а в x64 и IA64 их на самом деле меньше - 16 IRQL. Очевидно, что аппаратных устройств и программных сервисов больше, чем IRQL, что означает, что все некоторые системные объекты будут использовать IRQL.

Таблица IRQL для x64

    IRQL  |    Description
--------------------------------------------
    15    |    High/Profile
    14    |    Interprocessor interrupt/Power
    13    |    Clock
    12    |    Sync
    11    |    Device N
    ..    |    ...
     3    |    Device 1
     2    |    Dispatch/DPC
     1    |    APC
     0    |    Passive/Low

Более высокий IRQL (с большим числом) имеет более высокий приоритет. Все компоненты системы стараются поддерживать текущий IRQL процессора на минимально возможном уровне - 0. Если происходит прерывание более высокого уровня, то текущий уровень IRQL процессора повышается, и прерывания с более низким уровнем не будут обрабатываться, пока все прерывания с более высокими уровнями не будут разрешены. IRQ может обрабатываться пакетно, если планировщик IRQ может поставить в очередь несколько IRQ одного и того же уровня для выполнения процессором.

Какой смысл?

Все это было действительно хорошо разработано, чтобы отделить конечного пользователя от сложностей аппаратного обеспечения и создать универсальную архитектуру, которая может работать со многими типами аппаратного / программного обеспечения.

  1. Код уровня пользователя (т.е. не уровня ядра) выполняется только тогда, когда процессор находится на уровне пассивного / низкого (0) IRQL. Дело в том, что вы можете обрабатывать событие нажатия клавиши в вашем приложении только после обработки всех IRQL. Поэтому для клавиатуры не имеет значения, какой IRQL назначен аппаратному прерыванию.

  2. IRQL являются только абстракциями ОС и не установлены в камне. Соответствующие IRQ и IRQL хранятся в реестре Windows (например), и любой увлеченный пользователь может изменить их вручную.

Выводы

Цитаты из вопроса

Поскольку клавиатура USB использует универсальный драйвер USB и архитектуру, которая имеет доступ только к нескольким каналам IRQ, она не может предоставить клавиатуре доступ к IRQ с таким высоким приоритетом, как для другого (скажем, PS2) контроллера.

Возможно, автор имел в виду более низкий IRQL вместо меньшего количества каналов IRQ. В любом случае, это не имеет значения, так как это не видно пользователю на любом современном ПК. Возможные различия между уровнем нано- микросекунд, и они происходят только на уровне ядра. В обоих случаях код уровня пользователя блокируется ядром ОС.

Означает ли это (если это правда), что USB-клавиатуры будут менее чувствительными, чем клавиатуры, подключенные к другому типу порта?

Это не правда из-за способа разработки ОС. Если ОС чем-то занята и работает медленно, обе клавиатуры будут вести себя одинаково.

Возьмите, например, клавиатуру USB, сопоставленную с IRQ со средним приоритетом, в неисправной системе, которая застряла в другой программе прерывания со средним приоритетом.

В этом случае система будет BSOD, процедуры обработки IRQ должны быть разработаны до определенного стандарта (например, они должны быть быстрыми, синхронными, неблокирующими и т.д.). Любое отклонение от этого и у ядра будет BSOD.

Из-за относительно одинакового приоритета события клавиатуры будут игнорироваться, и вы не сможете отправить Ctrl-Alt-del или любое другое экстренное нажатие клавиши.

Если система зависает, есть много вещей, которые могут пойти не так, но, скорее всего, нажатие клавиши IRQL будет обработано на уровне драйвера. Проблема в том, что оно не будет доставлено приложению, которое подписалось на такое уведомление, так как ОС занята чем-то другим.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .