Могу ли я использовать порты ввода-вывода (asm: in, out
инструкции) для передачи данных через PCI Express на современном процессоре x86_64, или я могу использовать только BAR для MMIO (ввод-вывод с отображением памяти) и для DMA (прямой доступ к памяти к отображаемым в памяти областям памяти). устройства PCI-E)?
Могу ли я использовать порты ввода/вывода (asm: `in, out`) для передачи данных через PCI Express на современных процессорах x86_64?
Ответы (3)
Шины на основе PCI, включая PCI Express, поддерживают три различных адресных пространства: адресное пространство памяти, адресное пространство ввода-вывода и адресное пространство конфигурации. На компьютерах с архитектурой x86, включая те, которые используют процессоры x86_64, адресное пространство памяти отображается 1:1 (более или менее) с физическим адресным пространством процессора. Адресное пространство ввода/вывода сопоставляется 1:1 с адресным пространством ввода/вывода ЦП. Адресное пространство конфигурации отображается в фиксированное место в физическом адресном пространстве, выбранном BIOS во время загрузки.
Это означает, что инструкции x86 IN/OUT могут обращаться к устройствам PCI Express, но только если устройство фактически выделяет часть адресного пространства ввода/вывода. Вообще говоря, единственные устройства, которые имеют обратную совместимость с картами ISA. Например, последовательная карта PCI Express обеспечит интерфейс, совместимый с 8250 UART через пространство ввода-вывода, чтобы ее можно было использовать со стандартными драйверами последовательного порта. Если бы вместо этого использовался ввод-вывод с отображением памяти, устройству потребовался бы собственный драйвер.
Другие устройства PCE Express, которые по-прежнему используют пространство ввода-вывода, включают современные устройства, такие как видеокарты (для совместимости с VGA) и интерфейсы SATA (для совместимости с IDE). Все новое, что не нуждается в устаревшей поддержке, будет использовать исключительно ввод-вывод с отображением памяти. Нет никаких преимуществ, кроме обратной совместимости для использования адресного пространства ввода-вывода.
Я также должен указать, что вы используете BAR неправильно. BAR (регистры базовых адресов) используются ОС (или BIOS/прошивкой) для выделения областей памяти и/или пространства ввода-вывода для устройства. Они существуют в адресном пространстве конфигурации и не могут использоваться для передачи данных. Например, последовательная карта PCI Express будет иметь BAR, который определяет, где ее регистры, совместимые с 8450, отображаются в пространство ввода-вывода. ОС отобразит их в место, которое не используется никаким другим устройством.
В то время как на ПК ОС будет использовать ввод-вывод с отображением памяти для чтения и записи в BAR, драйвер этого не сделает. Для передачи данных драйвер должен получить доступ к областям памяти PCI или пространства ввода-вывода, которые были выделены устройству через BAR. Эти области будут содержать регистры, которые используются непосредственно для передачи данных, регистры для настройки DMA для выполнения передачи или отображаются в ОЗУ на устройстве, где хранятся данные.
(Я также должен добавить, что можно использовать часть пространства конфигурации PCI устройства в качестве регистров, специфичных для устройства, для выполнения передач, настройки или чего-либо еще. Гипотетическая последовательная карта PCI Express, не совместимая с предыдущими версиями, вероятно, вообще не будет определять какие-либо BAR и вместо этого отображать его UART регистрируется в своем конфигурационном пространстве.)
Я знаю только более поздние версии. Весь код доступа PCIe, который я написал, использует BAR и ввод-вывод с отображением памяти. Я думаю, что порты ввода-вывода сегодня используются довольно редко, потому что интерфейс, использующий их, по своей сути очень медленный. Количество адресуемых портов также очень ограничено. Однако то, требуются ли вашему конкретному устройству порты ввода/вывода, зависит от аппаратной реализации. По сути, архитектура, по-видимому, позволяет адресовать порты ввода-вывода также к устройствам PCIe, поскольку, например, видеокарта по-прежнему резервирует некоторые порты.
Имейте в виду, что непосредственный ввод in
наших out
команд из пользовательского кода в современной операционной системе вызовет сбой защиты, поскольку эти команды зарезервированы для кода драйвера.
Да, я думаю, что их можно использовать, но без них также можно использовать, но вам пришлось написать свою собственную ОС. В системе Windows NT они защищены, но вы можете использовать специальную программу привилегий для доступа к порту ввода-вывода. Вот и все