Assembly 我可以使用I/O端口(asm:`in,out`)在现代x86_64 CPU上通过PCI Express传输数据吗?

Assembly 我可以使用I/O端口(asm:`in,out`)在现代x86_64 CPU上通过PCI Express传输数据吗?,assembly,io,x86,pci,pci-e,Assembly,Io,X86,Pci,Pci E,我可以使用I/O端口(asm:in,out指令)在现代x86_64 CPU上通过PCI Express传输数据,还是只能使用MMIO(内存映射I/O)和DMA(直接内存访问PCI-E设备的内存映射区域)的条?我只知道更高版本。我编写的所有PCIe访问代码都使用条和内存映射IO。我认为现在很少使用I/O端口,因为使用这些端口的接口本质上非常慢。可寻址端口的数量也非常有限。但是,您的特定设备是否需要I/O端口取决于硬件的实现。基本上,该体系结构似乎也允许对PCIe设备进行基于I/O端口的寻址,例如图

我可以使用I/O端口(asm:
in,out
指令)在现代x86_64 CPU上通过PCI Express传输数据,还是只能使用MMIO(内存映射I/O)和DMA(直接内存访问PCI-E设备的内存映射区域)的条?

我只知道更高版本。我编写的所有PCIe访问代码都使用条和内存映射IO。我认为现在很少使用I/O端口,因为使用这些端口的接口本质上非常慢。可寻址端口的数量也非常有限。但是,您的特定设备是否需要I/O端口取决于硬件的实现。基本上,该体系结构似乎也允许对PCIe设备进行基于I/O端口的寻址,例如图形卡仍保留一些端口


请注意,在现代操作系统中,直接从用户代码发出
in
我们的
out
命令将导致保护故障,因为这些命令是为驱动程序代码保留的

是的,我认为他们的输入输出可以使用,但没有它也可以使用,但你必须编写自己的操作系统。在类似windows nt的系统中,它们受到保护,但u可以与特权程序一起使用以访问io端口。也就是说,包括PCI Express在内的基于PCI的总线支持三种不同的地址空间:内存地址空间、I/O地址空间和配置地址空间。在x86 PC(包括使用x86_64 CPU的PC)上,内存地址空间与CPU的物理地址空间的比例为1:1(或多或少)。I/O地址空间与CPU的I/O地址空间的比例为1:1。配置地址空间映射到BIOS在引导时选择的物理地址空间中的固定位置

这意味着x86输入/输出指令可以访问PCI Express设备,但前提是该设备实际分配了部分I/O地址空间。一般来说,只有那些向后兼容ISA卡的设备才能做到这一点。例如,PCI Express串行卡将通过I/O空间提供与8250 UART兼容的接口,以便与标准串行端口驱动程序一起使用。如果改用内存映射I/O,设备将需要自己的自定义驱动程序

其他仍使用I/O空间的PCE Express设备包括视频卡(用于VGA兼容性)和SATA接口(用于IDE兼容性)等现代设备。任何不需要传统支持的新功能都将专门使用内存映射I/O。使用I/O地址空间除了向后兼容之外没有其他优势

我还要指出,你使用酒吧是不正确的。操作系统(或BIOS/固件)使用条(基址寄存器)为设备分配内存区域和/或I/O空间。它们存在于配置地址空间中,无法用于传输数据。例如,PCI Express串行卡将具有一个条,用于确定其8450兼容寄存器映射到I/O空间的位置。操作系统会将它们映射到一个其他任何设备都不会使用的位置

在PC上,操作系统会使用内存映射I/O来读写条,而驱动程序则不会。为了传输数据,驱动程序将访问通过条分配给设备的PCI内存或I/O空间区域。这些区域将包含直接用于传输数据的寄存器、用于设置DMA以进行传输的寄存器或映射到存储数据的设备上的RAM的寄存器


(我还应该补充一点,即可以将设备的PCI配置空间的一部分用作设备特定的寄存器,用于执行传输、配置或其他任何操作。假设的非向后兼容PCI Express串行卡可能根本不定义任何条,而是将其UART寄存器映射到其配置空间。)

谢谢。你是说条形图和内存映射IO是一样的,这些概念是等价的吗?是的,它们或多或少是等价的。如果我没记错的话,BAR只是一个预先分配的地址范围,它属于设备(当设备第一次被看到时,它的地址被分配),而可以动态分配更多的内存用于内存映射IO。根据硬件的不同,“BAR”的备份内存可能位于给定的设备上,而不是RAM上,但从编程的角度来看,这并不重要(除非您需要支持热插拔)。BAR是PCI设备中定义地址范围的寄存器。设备中的每个栏可以定义MMIO范围或I/O范围。地址范围的类型和大小由设备固定,而不是由软件固定。条形图从不指系统RAM;它总是映射到设备上的地址空间,地址空间通常由设备寄存器支持,但也可以由RAM支持。