如何与连接到并行端口的设备通话



假设我的计算机中有一个并行端口,现在该并行端口将有一些与之相关的内存,CPU可以访问这些内存(不确定并行端口是使用内存映射IO还是端口映射IO)。

现在,如果我想向并行端口发送信号或从并行端口接收信号,我必须向与并行端口相关的存储器写入或从中读取。

现在假设我有一台连接到并行端口的打印机,打印机也会有一些内存(例如:它可能有一个缓冲区,用来存储应该打印的数据)。

我的问题是,CPU是否可以直接访问打印机的内存,例如,CPU是否能够直接写入打印机的缓冲区?还是通过并行端口间接地与打印机通信?

传统的PC并行端口使用in/out的端口I/O,而不是MMIO。外部信号线直接映射到I/O寄存器,因此单个out指令将设置所有8条信号线。你可以把LED+电阻连接起来试试。(有趣的项目。)

这个页面有Linux、Windows和DOS程序,它们使用outb在并行端口的引脚上放置一个字节。它还有很多关于并行端口的介绍,包括一个重要的点,即USB并行端口有相同的外部接口,但内部软件接口不同。USB parport无法使用in/out指令。


CPU是否可以直接访问打印机的内存

否。我想你在问你是否可以运行一条x86指令,它从CPU寄存器一直存储到打印机内存。如果打印机正处于接收突发数据的过程中,那么将一个字节放在该并行端口的引脚上将导致打印机将该字节复制到其内存中。但要进行设置,您需要以打印机理解的任何通信协议发送命令。

想象一下FTP或web服务器。您可以读取或写入远程文件,但必须先发送命令才能开始传输,然后通信链路(网络套接字)只承载传输的数据。您正在与远程计算机上的程序对话,而不是直接读取其磁盘内容或RAM。


正如维基百科漂亮的并行端口文章所指出的,计算机->打印机的流量控制是通过打印机取消断言BUSY引脚来实现的。然后,计算机可以将下一个字节放在数据引脚上,并将带有out的STROBE引脚设置为控制寄存器。(维基百科上的文章有针到寄存器的位映射)。然后在软件中进行轮询,直到看到BUSY线变高,然后再次变低。

将字节一次一个地填充到I/O端口称为"编程I/O"。它很慢,而且只会占用你所有的CPU时间

还有其他方法可以在现代(而不是现代)计算机中对并行端口进行编程。例如,ECP是对同一物理并行端口进行编程的一种完全独立的方式。它可以使用DMA,所以你给硬件一个字节的缓冲区,它为你做硬件握手,所以CPU可以做其他事情,而不是轮询parport。打印机是否将它们存储到内存中是一个单独的问题。


从技术上讲,CPU甚至不能直接访问并行端口;它必须通过南桥才能到达。但当CPU核心运行inout指令时,硬件会处理这一问题。


BTW、PC端口是双向的。在以太网广泛使用之前,用串行或并行端口连接两台计算机来传输文件并不罕见。(或者使用链路携带IP数据包,作为以太网的替代方案。)并行端口(尤其是ECP)比串行端口快得多(2.5MB/s,而在典型的PC硬件上为115kbit/s)。并行端口可能比10Mbit/s以太网还要快。我记得在Linux上偶尔会这样做,因为它有很好的PLIP内核驱动程序。


脚注:

从本地内存到远程内存的"直接"复制(反之亦然)称为远程DMA(RDMA)。这主要意味着硬件负责启动复制命令的协议内容,并且在远程端不会发生访问控制。(即,写入错误的内存地址可能会导致远程崩溃。)InfiniBand是一个与RDMA相关的知名硬件接口,用于高性能计算和/或存储服务器。

火线控制器也支持RDMA。看见https://en.wikipedia.org/wiki/DMA_attack对于不可信设备读取/写入主机内存的上下文中的描述,它不应该。

最新更新