Могу ли я использовать порты ввода/вывода (asm: in, out
) для передачи данных через PCI Express на современный процессор x86_64 или я могу использовать только BAR для MMIO (Memory Mapped I/O) и для DMA (Direct Memory Acces to memory mapping регионах устройств PCI-E)?Могу ли я использовать порты ввода/вывода (asm: `in, out`) для передачи данных через PCI Express на современный процессор x86_64?
ответ
Шины на основе PCI, включая PCI Express, поддерживают три разных адресных пространства: адресное пространство памяти, адресное пространство ввода-вывода и адресное пространство конфигурации. На компьютерах x86, включая те, которые используют процессоры x86_64, адресное пространство памяти отображается 1: 1 (более или менее) с физическим адресным пространством ЦП. Адресное пространство ввода-вывода отображается 1: 1 с адресным пространством ввода-вывода CPU. Адресное пространство конфигурации отображается в фиксированное место в физическом адресном пространстве, выбранном BIOS во время загрузки.
Это означает, что инструкции x86 IN/OUT могут обращаться к устройствам PCI Express, но только если устройство фактически распределяет часть адресного пространства ввода-вывода. Вообще говоря, единственными устройствами, которые работают, являются те, которые обратно совместимы с картами ISA. Например, последовательная плата PCI Express обеспечит интерфейс, совместимый с пространством ввода-вывода 8250 UART, чтобы его можно было использовать со стандартными драйверами последовательного порта. Если бы он использовал память с отображением ввода-вывода, вместо этого устройство потребовало бы собственного пользовательского драйвера.
Другие устройства PCE Express, которые все еще используют пространство ввода/вывода, включают в себя современные устройства, такие как видеокарты (для совместимости с VGA) и интерфейсы SATA (для совместимости с IDE). Все новое, что не нуждается в устаревшей поддержке, будет использовать исключительно модулированный ввода-вывода с памятью. Нет никакого преимущества, кроме обратной совместимости для использования адресного пространства ввода-вывода.
Я также должен указать, что ваше использование BAR неверно. BAR (регистры базовых адресов) используются ОС (или BIOS/firmware) для распределения областей памяти и/или пространства ввода/вывода на устройстве. Они существуют в адресном пространстве конфигурации, не могут использоваться для передачи данных. Например, последовательная карта PCI Express имела бы БАР, который определяет, где его 8450-совместимые регистры отображаются в пространство ввода-вывода. ОС отобразит их в местоположение, которое не используется никаким другим устройством.
В то время как на ПК ОС будет использовать операции ввода/вывода с памятью для чтения и записи в БАР, драйвер не будет. Для передачи данных драйвер получит доступ к областям памяти PCI или пространству ввода/вывода, которые были выделены устройству через BAR. Эти регионы будут содержать регистры, которые используются непосредственно для передачи данных, регистры для настройки DMA для передачи или отображения в ОЗУ на устройстве, где хранятся данные.
(Я также хотел бы добавить его возможность использовать часть конфигурационного пространства PCI в качестве регистра конкретных устройств для выполнения операций передачи, конфигурации или чего-либо еще.Гипотетическая, не поддерживающая обратную совместимость PCI Express последовательная карта, вероятно, вообще не определит никаких BAR и вместо этого отобразит ее регистры UART в своем конфигурационном пространстве.)
Я знаю только о более поздних версиях. Весь код доступа PCIe, который я написал, использует BAR и Memory Mapped IO. Я думаю, что порты ввода-вывода довольно редко используются сегодня, потому что интерфейс, использующий их, по сути, очень медленный. Количество адресуемых портов также очень ограничено. Однако, зависит ли ваше конкретное устройство от портов ввода/вывода от реализации оборудования. В принципе, архитектура, похоже, разрешает адресацию на основе ввода-вывода на устройствах PCIe, так как, например, графическая карта по-прежнему резервирует некоторые порты.
Знайте, что непосредственно выдача in
наших команд out
из кода пользователя в современной операционной системе вызовет ошибку защиты, поскольку эти команды зарезервированы для кода драйвера.
Да, я думаю, что они могут использоваться, но без него также могут быть использованы, но у вас нужно написать ур. В windows nt, как система, они защищены, но вы можете использовать специальную программу привилегий для доступа к порту io. Вот так
Спасибо. Вы имеете в виду, что BAR и Memory Mapped IO одинаковы, эти понятия эквивалентны? – Alex
Да, они более или менее эквивалентны. Если я правильно помню, BAR - это только предопределенный диапазон адресов, принадлежащий устройству (и адрес которого назначается при первом просмотре устройства), в то время как можно динамически распределять больше памяти, которая будет использоваться для IO с памятью. В зависимости от аппаратного обеспечения резервная память «BAR» может быть на данном устройстве, а не в ОЗУ, но это не имеет особого значения с точки зрения программирования (если вам не нужна поддержка Hot-Pluging). – PMF
A BAR - это регистр в устройстве PCI, который определяет диапазон адресов. Каждый BAR в устройстве может определять либо диапазон MMIO, либо диапазон ввода/вывода. Тип и размер диапазона адресов фиксируются устройством, а не программным обеспечением. BAR никогда не ссылается на системную RAM; он всегда отображает адресное пространство на устройстве, которое обычно поддерживается регистрами устройств, но может быть поддержано оперативной памятью. – prl