传统的 PC 并行端口使用带有 in/out 的端口 I/O,而不是 MMIO。外部信号线直接映射到 I/O 寄存器,因此单个out 指令将设置所有 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 引脚设置为控制寄存器。 (维基百科文章有 pin 到寄存器位映射)。然后在软件中轮询,直到看到 BUSY 线变高,然后再次变低。
一次将一个字节填充到 I/O 端口中称为“编程 I/O”。它很慢,而且会占用你所有的 CPU 时间。
还有其他方法可以对现代(和不那么现代)计算机中的并行端口进行编程。例如,ECP 是对同一物理并行端口进行编程的完全不同的方式。它可以使用 DMA,所以你给硬件一个字节缓冲区,它为你做硬件握手,所以 CPU 可以做其他事情而不是轮询 parport。打印机是否将它们存储到内存中是一个单独的问题。
从技术上讲,CPU 甚至不能直接访问并行端口;它必须访问它via the southbridge。但是当 CPU 内核运行 in 或 out 指令时,硬件会处理这个问题。
顺便说一句,PC parports 是双向的。在以太网广泛使用之前,通过串行或并行端口连接两台计算机以传输文件的情况并不少见。 (或使用传输 IP 数据包的链路,作为以太网的替代方案。)并行端口(尤其是 ECP)比串行端口快得多(典型 PC 硬件上为 2.5MB/s 与 115 kbit/s)。并行端口可能甚至比 10Mbit/s 以太网还要快。我记得有时在 Linux 上会这样做,因为它有很好的 PLIP 内核驱动程序。
脚注:
“直接”从本地内存复制到远程内存(反之亦然)是called Remote DMA (RDMA)。这主要意味着硬件负责启动复制命令的协议内容,并且远程端不会发生访问控制。 (即,您可以通过写入错误的内存地址来使远程端崩溃。)InfiniBand 是一种与 RDMA 相关的著名硬件接口,用于高性能计算和/或存储服务器。
Firewire 控制器也支持 RDMA。请参阅 https://en.wikipedia.org/wiki/DMA_attack 以获取在不可信设备不应该读取/写入主机内存的上下文中的描述。