Порт 0x60
Порт 0x60 — это аппаратный порт ввода-вывода (I/O port) в архитектуре x86-совместимых компьютеров, традиционно используемый для взаимодействия центрального процессора с контроллером клавиатуры (Keyboard Controller). Физически порт 0x60 является частью микросхемы контроллера клавиатуры, которая в современных системах интегрирована в чипсет материнской платы или в суперввод-вывод (Super I/O). В классической реализации IBM PC/AT эту функцию выполнял микроконтроллер Intel 8042 (или его аналоги).
История и происхождение
Порт 0x60 берёт начало в архитектуре IBM PC/AT, выпущенной в 1984 году. В этой системе для управления клавиатурой использовался отдельный микроконтроллер Intel 8042, который имел два 8-битных порта ввода-вывода: порт 0x60 (порт данных) и порт 0x64 (порт команд/статуса). Такая схема была заимствована из более ранних конструкций, где клавиатура подключалась через последовательный интерфейс, а микроконтроллер выполнял функции буферизации и декодирования скан-кодов.
С развитием компьютерных систем физический контроллер клавиатуры перестал быть отдельной микросхемой: его функции были интегрированы в южный мост чипсета (например, Intel PIIX4, ICH серии) или в микросхему Super I/O (например, ITE, Nuvoton). Однако адресное пространство порта 0x60 и протокол обмена с ним остались неизменными для обеспечения обратной совместимости с программным обеспечением, написанным для IBM PC/AT.
Функциональное назначение
Порт 0x60 является портом данных контроллера клавиатуры. Через него осуществляется:
- Чтение скан-кодов клавиатуры. При нажатии или отпускании клавиши клавиатура отправляет последовательность скан-кодов (make code — код нажатия, break code — код отпускания). Контроллер клавиатуры принимает эти коды, помещает их в свой буфер и генерирует аппаратное прерывание IRQ1 (в современных системах — через контроллер прерываний APIC). Операционная система или драйвер считывает скан-код из порта 0x60.
- Запись команд и данных в контроллер клавиатуры. Программное обеспечение может отправлять команды контроллеру клавиатуры через порт 0x64, а данные для этих команд (например, параметры, значения светодиодов) записываются в порт 0x60. Примеры команд: установка состояния светодиодов (Caps Lock, Num Lock, Scroll Lock), изменение скорости автоповтора (typematic rate), сброс контроллера.
- Чтение выходного порта контроллера (в некоторых реализациях). В архитектуре IBM PC/AT контроллер клавиатуры (8042) имел два выходных порта (P1 и P2), которые использовались для управления линией сброса процессора (A20 Gate) и для других системных целей. Чтение порта 0x60 могло возвращать состояние этих выходных линий, хотя в современных системах эта функция реализована иначе.
Технические детали
Адресация и размер
Порт 0x60 является 8-битным (байтовым) портом ввода-вывода. В архитектуре x86 для обращения к портам используются специальные инструкции процессора: IN (чтение из порта) и OUT (запись в порт). Адрес порта задаётся в 16-битном формате, что позволяет адресовать до 65536 портов (0x0000 — 0xFFFF). Порт 0x60 занимает адрес 96 в десятичной системе.
Взаимодействие с портом 0x64
Порт 0x64 (адрес команд/статуса) является неотъемлемой частью протокола работы с контроллером клавиатуры. Перед чтением данных из порта 0x60 или записью в него программное обеспечение должно проверить статус контроллера через порт 0x64. Ключевые биты статуса:
- Бит 0 (Output Buffer Full): указывает, что в буфере порта 0x60 есть данные, готовые для чтения. Если этот бит равен 1, чтение порта 0x60 вернёт корректный скан-код или другой ответ.
- Бит 1 (Input Buffer Full): указывает, что буфер для записи данных в контроллер занят. Перед записью в порт 0x60 или 0x64 необходимо дождаться, пока этот бит станет равен 0.
- Бит 2 (System Flag): отражает результат самотестирования контроллера при включении питания (POST).
- Бит 3 (Command/Data): при чтении порта 0x60 этот бит указывает, являются ли данные скан-кодом от клавиатуры (0) или ответом на команду, отправленную контроллеру (1).
Прерывания
При получении скан-кода от клавиатуры контроллер генерирует аппаратное прерывание IRQ1 (вектор 0x09 в реальном режиме). Обработчик прерывания считывает скан-код из порта 0x60, преобразует его в код символа (с учётом раскладки клавиатуры и состояния модификаторов) и помещает в буфер клавиатуры операционной системы. В современных ОС (Windows, Linux, macOS) драйвер клавиатуры обрабатывает прерывание и передаёт скан-код подсистеме ввода.
Применение в современных системах
Несмотря на то, что физический интерфейс клавиатуры (PS/2) в большинстве современных компьютеров заменён на USB, эмуляция порта 0x60 сохраняется на уровне прошивки (BIOS/UEFI) и в драйверах операционной системы. Это необходимо для:
- Обеспечения обратной совместимости. Множество старых программ, включая загрузчики операционных систем (например, GRUB) и некоторые утилиты, напрямую обращаются к порту 0x60.
- Работы в режиме реального режима (Real Mode). При загрузке компьютера до перехода в защищённый режим (Protected Mode) или 64-битный режим (Long Mode) процессор работает в реальном режиме, где доступ к портам ввода-вывода не требует привилегий. BIOS/UEFI использует порт 0x60 для управления клавиатурой на этапе POST и загрузки.
- USB-клавиатур. В прошивке UEFI и в драйверах операционных систем USB-клавиатуры эмулируются как PS/2-устройства. Контроллер USB (EHCI, XHCI) или драйвер преобразует USB-скан-коды в формат, совместимый с портом 0x60, что позволяет старым программам работать с USB-клавиатурами без изменений.
Проблемы и ограничения
- Производительность. Прямой доступ к порту 0x60 через инструкции
IN/OUTявляется медленным по сравнению с современными методами ввода (например, через USB или шину PCI Express). В современных ОС прямой доступ к порту 0x60 из пользовательских приложений обычно запрещён из соображений безопасности. - Конфликты адресов. В некоторых системах порт 0x60 может использоваться другими устройствами (например, встроенным таймером или контроллером прерываний), что может приводить к конфликтам при неправильной настройке. Однако в стандартной архитектуре x86 этот порт зарезервирован исключительно за контроллером клавиатуры.
- Эмуляция. В системах, где контроллер клавиатуры отсутствует физически (например, в некоторых встраиваемых устройствах или виртуальных машинах), эмуляция порта 0x60 может быть неполной или отсутствовать. Это может вызывать проблемы с загрузкой некоторых операционных систем или утилит.
Значение для безопасности
Порт 0x60 является одним из ключевых элементов низкоуровневого доступа к системе. В некоторых атаках (например, атаки на BIOS/UEFI или руткиты) злоумышленники могут использовать прямой доступ к порту 0x60 для перехвата нажатий клавиш (keylogging) или для выполнения произвольных команд на контроллере клавиатуры. Для защиты от таких атак современные операционные системы (начиная с Windows Vista и Linux с поддержкой SMAP/SMEP) ограничивают прямой доступ к портам ввода-вывода для непривилегированных процессов.
Интересные факты
- Порт 0x60 вместе с портом 0x64 является одним из немногих аппаратных портов, чей адрес остался неизменным с момента появления IBM PC/AT (1984 год) до современных компьютеров.
- В некоторых старых компьютерах (например, IBM PCjr) порт 0x60 использовался для других целей, что привело к проблемам совместимости с программным обеспечением, написанным для IBM PC/AT.
- В эмуляторах (например, QEMU, Bochs, DOSBox) порт 0x60 эмулируется программно, что позволяет запускать старые программы, работающие с клавиатурой на низком уровне, на современных системах.
Источники
- IBM PC/AT Technical Reference (1984).
- Intel 8042 Keyboard Controller Datasheet.
- Intel Platform Controller Hub (PCH) Family Datasheet.
- OSDev Wiki: "PS/2 Keyboard".
- Linux Kernel Documentation: "ps2.txt".
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →