Могу ли я использовать порты ввода/вывода (asm: `in, out`) для передачи данных через PCI Express на современных процессорах x86_64?

Могу ли я использовать порты ввода-вывода (asm: in, out инструкции) для передачи данных через PCI Express на современном процессоре x86_64, или я могу использовать только BAR для MMIO (ввод-вывод с отображением памяти) и для DMA (прямой доступ к памяти к отображаемым в памяти областям памяти). устройства PCI-E)?


person Alex    schedule 09.11.2013    source источник


Ответы (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 регистрируется в своем конфигурационном пространстве.)

person Ross Ridge    schedule 20.01.2016

Я знаю только более поздние версии. Весь код доступа PCIe, который я написал, использует BAR и ввод-вывод с отображением памяти. Я думаю, что порты ввода-вывода сегодня используются довольно редко, потому что интерфейс, использующий их, по своей сути очень медленный. Количество адресуемых портов также очень ограничено. Однако то, требуются ли вашему конкретному устройству порты ввода/вывода, зависит от аппаратной реализации. По сути, архитектура, по-видимому, позволяет адресовать порты ввода-вывода также к устройствам PCIe, поскольку, например, видеокарта по-прежнему резервирует некоторые порты.

Имейте в виду, что непосредственный ввод in наших out команд из пользовательского кода в современной операционной системе вызовет сбой защиты, поскольку эти команды зарезервированы для кода драйвера.

person PMF    schedule 10.11.2013
comment
Спасибо. Вы имеете в виду, что BAR и ввод-вывод с отображением памяти одинаковы, эти понятия эквивалентны? - person Alex; 10.11.2013
comment
Да, они более или менее эквивалентны. Если я правильно помню, BAR — это просто предварительно выделенный диапазон адресов, который принадлежит устройству (и адрес которого назначается при первом появлении устройства), в то время как можно динамически выделять больше памяти для использования для операций ввода-вывода с отображением памяти. В зависимости от аппаратного обеспечения резервная память BAR может быть на данном устройстве вместо ОЗУ, но это не имеет большого значения с точки зрения программирования (если только вам не нужно поддерживать горячее подключение). - person PMF; 10.11.2013
comment
BAR — это регистр в устройстве PCI, определяющий диапазон адресов. Каждый BAR в устройстве может определять либо диапазон MMIO, либо диапазон ввода/вывода. Тип и размер диапазона адресов фиксируются устройством, а не программным обеспечением. BAR никогда не относится к оперативной памяти системы; он всегда сопоставляется с адресным пространством на устройстве, которое обычно поддерживается регистрами устройства, но может поддерживаться оперативной памятью. - person prl; 17.09.2017

Да, я думаю, что их можно использовать, но без них также можно использовать, но вам пришлось написать свою собственную ОС. В системе Windows NT они защищены, но вы можете использовать специальную программу привилегий для доступа к порту ввода-вывода. Вот и все

person Manoj Singh    schedule 20.01.2016