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瞭解不可信設備讀取/寫入主機內存時的說明。

相關問題