Могу ли я использовать порты ввода / вывода (asm: `in, out`) для передачи данных через PCI Express на современный процессор x86_64?
Могу ли я использовать порты ввода / вывода (asm: in, out
инструкции) для передачи данных через PCI Express на современный процессор x86_64 или я могу использовать только BAR для MMIO(Memory Ipped I/O) и для DMA(прямой доступ к памяти в области отображения памяти устройств PCI-E)?
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 (регистры базовых адресов) используются ОС (или BIOS/ встроенным программным обеспечением) для выделения областей памяти и / или пространства ввода-вывода для устройства. Они существуют в адресном пространстве конфигурации и не могут быть использованы для передачи данных. Например, последовательная карта PCI Express будет иметь BAR, который определяет, где ее регистры, совместимые с 8450, отображаются в пространство ввода-вывода. ОС будет сопоставлять их с местоположением, которое не используется никаким другим устройством.
В то время как на ПК ОС будет использовать ввод-вывод с отображением памяти для чтения и записи в BAR, драйвер не будет. Для передачи данных драйвер должен получить доступ к областям памяти PCI или пространству ввода-вывода, которые были выделены для устройства через BAR. Эти регионы будут содержать регистры, которые используются непосредственно для передачи данных, регистры для настройки прямого доступа к памяти для выполнения передачи или сопоставления с ОЗУ на устройстве, где хранятся данные.
(Я также должен добавить, что можно использовать часть пространства конфигурации PCI устройства в качестве специфических регистров устройства для выполнения передач, конфигурации или чего-либо еще. Гипотетическая не обратно совместимая последовательная карта PCI Express, вероятно, вообще не будет определять какие-либо BAR и вместо этого отображать его UART регистрируется в своем пространстве конфигурации.)
Я знаю только о более поздних версиях. Весь код доступа к PCIe, который я написал, использует BAR и Memory Mapped IO. Я думаю, что порты ввода / вывода сегодня используются довольно редко, потому что интерфейс, использующий их, по сути очень медленный. Количество адресуемых портов также очень ограничено. Однако то, требует ли ваше конкретное устройство порты ввода / вывода, зависит от реализации аппаратного обеспечения. По сути, архитектура, по-видимому, допускает адресацию на основе портов ввода / вывода также для устройств PCIe, поскольку, например, графическая карта все еще резервирует некоторые порты.
Имейте в виду, что непосредственно выдача in
наш out
Команды из кода пользователя в современной операционной системе вызовут ошибку защиты, потому что эти команды зарезервированы для кода драйвера.
Да, я думаю, что они могут быть использованы, но без него также могут быть использованы, но вы должны были написать свою собственную ОС. В Windows NT-подобных системах они защищены, но вы можете использовать специальную программу привилегий для доступа к порту io. это оно