X86 如何与连接到并行端口的设备通信?

X86 如何与连接到并行端口的设备通信?,x86,operating-system,hardware,parallel-port,X86,Operating System,Hardware,Parallel Port,假设我的计算机中有一个并行端口,现在并行端口将有一些与之关联的内存,CPU可以访问这些内存(不确定并行端口是否使用内存映射IO或端口映射IO) 现在,如果我想向并行端口发送信号或从并行端口接收信号,我必须向与并行端口相关联的内存进行写入或读取 现在假设我有一台连接到并行端口的打印机,打印机也会有一些内存(例如:它可能有一个缓冲区,用来存储它应该打印的数据) 我的问题是,CPU是否可以直接访问打印机的内存,例如,CPU是否可以直接写入打印机的缓冲区?或者与打印机对话的唯一方式是通过并行端口间接进行

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

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

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


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

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

、Windows和DOS程序,这些程序使用
outb
在并行端口的引脚上放置一个字节。它也有很多关于并行端口的介绍性内容,包括一个重要的观点,即USB并行端口具有相同的外部接口,但具有不同的内部软件接口。USB端口不能与
in
/
out
指令一起使用


CPU能否直接访问打印机的内存

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

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


如前所述,计算机->打印机的流量控制是通过打印机取消对忙pin的断言来实现的。然后,计算机可以将下一个字节放在数据管脚上,并将带有
输出的选通管脚设置到控制寄存器中。(维基百科文章中有pin到寄存器的位映射)。然后在软件中进行轮询,直到看到占线先高后低

将字节一次填充到I/O端口称为“编程I/O”。它的速度很慢,而且会占用您所有的CPU时间来完成这项工作。

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


从技术上讲,CPU甚至不能直接访问并行端口;它必须访问它。但是,当CPU核心运行
in
out
指令时,硬件会处理这个问题


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


脚注:

从本地到远程内存(反之亦然)的“直接”复制是不允许的。这主要意味着硬件负责启动复制命令的协议内容,远程端不进行访问控制。(即,您可以通过写入错误的内存地址使远程端崩溃。)InfiniBand是一种与RDMA相关联的知名硬件接口,用于高性能计算和/或存储服务器


控制器也支持RDMA。有关不受信任的设备读取/写入主机内存的说明,请参阅。

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