我可以使用I / O端口(asm:in, out
指令)在现代x86_64 CPU上通过PCI Express传输数据,或者我只能使用BAR进行MMIO(存储器映射I / O)和DMA(直接传输)内存访问PCI-E设备的内存映射区域?
答案 0 :(得分:2)
基于PCI的总线(包括PCI Express)支持三种不同的地址空间:存储器地址空间,I / O地址空间和配置地址空间。在x86 PC上,包括那些使用x86_64 CPU的PC,内存地址空间与CPU的物理地址空间1:1(或多或少)映射。 I / O地址空间以1:1的形式映射到CPU的I / O地址空间。配置地址空间映射到BIOS在引导时选择的物理地址空间中的固定位置。
这意味着x86 IN / OUT指令可以访问PCI Express设备,但前提是设备实际分配了部分I / O地址空间。一般来说,唯一能做的是那些向后兼容ISA卡的设备。例如,PCI Express串行卡将通过I / O空间提供与8250 UART兼容的接口,以便可以与标准串行端口驱动程序一起使用。如果它使用内存映射I / O而不是设备需要自己的自定义驱动程序。
仍然使用I / O空间的其他PCE Express设备包括现代设备,如视频卡(用于VGA兼容性)和SATA接口(用于IDE兼容性)。任何不需要传统支持的新内容都将专门使用内存映射I / O.除了向后兼容性之外,使用I / O地址空间没有任何优势。
我还应该指出你对BAR的使用是不正确的。 OS(或BIOS /固件)使用BAR(基本地址寄存器)将存储器和/或I / O空间的区域分配给设备。它们存在于配置地址空间中,不能用于传输数据。例如,PCI Express串行卡将具有BAR,用于确定其8450兼容寄存器映射到I / O空间的位置。操作系统会将它们映射到任何其他设备都不使用的位置。
在PC上,操作系统会使用内存映射I / O来读取和写入BAR,驱动程序不会。为了传输数据,驱动程序将访问已通过BAR分配给设备的PCI存储器区域或I / O空间。这些区域将包含直接用于传输数据的寄存器,用于设置DMA以进行传输的寄存器或映射到保存数据的设备上的RAM。
(我还应该添加它可能使用设备的PCI配置空间的一部分作为设备特定的寄存器来执行传输,配置或其他任何事情。假设的非向后兼容的PCI Express串行卡可能不会定义任何BAR都可以将其UART寄存器映射到其配置空间中。)
答案 1 :(得分:1)
我只知道更高版本。我编写的所有PCIe访问代码都使用BAR和内存映射IO。我认为今天很少使用I / O端口,因为使用它们的接口固有地非常慢。可寻址端口的数量也非常有限。但是,您的特定设备是否需要I / O端口取决于硬件的实现。基本上,该架构似乎也允许基于I / O端口的寻址也适用于PCIe设备,例如显卡仍然保留一些端口。
请注意,在现代操作系统中直接从用户代码发出in
out
命令会导致保护错误,因为这些命令是为驱动程序代码保留的。
答案 2 :(得分:-2)
是的我认为他们可以使用但没有它也可以使用但你必须写你自己的操作系统。在windows nt like system中它们受到保护,但你可以使用特殊权限程序来访问io端口。就是这样