目錄
一:概述
二:I/O端口和I/O內存的概念
三:硬件寄存器(I/O寄存器)和內存
四:使用I/O端口
一:概述
驅動程序是軟件與硬件之間的抽象層;因此,它需要與這兩者對話,本文將向你展示驅動程序如何與硬件對話。并介紹I/O端口和I/O內存的概念。
二:I/O端口和I/O內存的概念
CPU通過寫入和讀取硬件寄存器的方式來控制硬件設備。在大多數情況下,一個硬件設備有多個寄存器,可以通過連續的地址訪問它們,我們將這些可被CPU讀寫的硬件寄存器稱為I/O端口。在硬件層面,訪問I/O端口是通過地址總線和控制總線發送讀寫控制信號,以及通過數據總線讀取或寫入數據來訪問的。
一些CPU制造商在其芯片內部采用統一的地址空間,認為訪問設備寄存器和訪問內存的方式相同,使用同一地址空間即可。而另一些則認為硬件設備不同于內存,因此應該有單獨的地址空間,比如像最著名的x86系列就為I/O地址設置了獨立的讀寫電氣線路,并為訪問改地址設置了特殊的CPU指令。出于上述原因,Linux在其運行的所有平臺上都實現了I/O端口的概念,即使在使用統一地址空間的平臺上也是如此。
然而上面說的I/O端口并不是設備訪問的唯一方式,目前大多數PCI設備都將硬件寄存器映射到內存地址區域,我們將這樣的內存區域稱為I/O內存,即可以像訪問普通內存一樣來訪問設備,因此它不需要使用特殊的處理器指令,CPU訪問內存的效率更高,而且編譯器在訪問內存時,在寄存器分配和尋址方式選擇方面有