2017-10-10 63 views
3

假设我的计算机中有一个并行端口,现在并行端口会有一些与CPU相关的内存(不确定并行端口是否使用内存映射IO或端口映射IO)。如何与连接到并行端口的设备通话?

现在,如果我想发送信号到并行端口或从并行端口接收信号,我将不得不写入或读取与并行端口关联的内存。

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

我的问题是,CPU可以直接访问打印机的内存,例如,CPU可以直接写入打印机的缓冲区吗?或者是与打印机交谈的唯一方式是通过并行端口间接进行?

+0

问题是关于编程并行端口的标题?问题的主体似乎与此无关。 –

回答

1

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

This page has Linux,Windows和DOS程序使用outb在并行端口的引脚上放置一个字节。它还有许多关于并行端口的介绍性内容,其中包括USB并行端口具有相同外部接口,但具有不同内部软件接口的重要一点。一个USB端口将不适用于in/out说明。


可以在CPU访问打印机直接

不,我认为你是问你是否可以运行从CPU商店注册所有的x86指令记忆打印机内存的方式。如果打印机恰好处于接收突发数据的中间,那么在该并行端口的引脚上放置一个字节将导致它将该字节复制到其内存中。但要设置它,您需要以打印机可以识别的任何通信协议发送命令。

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


作为Wikipedia's nice parallel port article points out,流动控制计算机 - >打印机通过打印机去断言的BUSY引脚来实现的。然后计算机可以将下一个字节放在数据引脚上,并将带有out的STROBE引脚设置到控制寄存器。 (维基百科文章具有注册位映射的引脚)。然后在软件中进行轮询,直至看到BUSY线路再次变高然后再次变低。

一次一个地填充字节到I/O端口称为“编程I/O”。这很慢,并使用你所有的CPU时间。

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


从技术上讲,CPU甚至不能直接访问并行端口;它必须访问它via the southbridge。但是当CPU内核运行inout指令时,硬件会照顾到这一点。


而BTW,PC parports是双向的。在以太网广泛应用之前,将两台计算机连接到串行或并行端口来传输文件并不罕见。 (或者使用链接传输IP数据包,作为以太网的替代品)。并行端口(特别是ECP)比串行速度要快得多(在典型的PC硬件上,2.5MB/s比115kbit/s)。并行端口甚至可能比10Mbit/s以太网更快。我记得有时在Linux上这样做,因为它有PLIP的内核驱动程序。


脚注:

“直接” 从本地到远程存储器(或反之亦然)的复制是called Remote DMA (RDMA)。它主要意味着硬件负责启动复制命令的协议内容,并且远程端不会发生访问控制。 (即,您可以通过写入错误的内存地址来使远程端发生故障)。InfiniBand是与RDMA相关的一个与高性能计算和/或存储服务器相关的众所周知的硬件接口。

Firewire控制器也支持RDMA。请参阅https://en.wikipedia.org/wiki/DMA_attack了解不可信设备读取/写入主机内存时的说明。

相关问题