CPU對外設IO埠實體地址的編址方式有兩種:一種是I/O對映方式(I/O-mapped),另一種是記憶體對映方式(Memory-mapped).
有些體系結構的CPU(如,PowerPC、m68k等)通常只實現一個實體地址空間(RAM)。在這種情況下,外設I/O埠的實體地址就被對映到CPU的單一實體地址空間中,而成為記憶體的一部分。此時,CPU可以象訪問一個記憶體單元那樣訪問外設I/O埠,而不需要設立專門的外設I/O指令。這就是所謂的"記憶體對映方式"(Memory-mapped)。
而另外一些體系結構的CPU(典型地如X86)則為外設專門實現了一個單獨地地址空間,稱為"I/O地址空間"或者"I/O埠空間"。這是一個與CPU地RAM實體地址空間不同的地址空間,所有外設的I/O埠均在這一空間中進行編址。CPU通過設立專門的I/O指令(如X86的IN和OUT指令)來訪問這一空間中的地址單元(也即I/O埠)。這就是所謂的"I/O對映方式"(I/O-mapped)。與RAM實體地址空間相比,I/O地址空間通常都比較小,如x86 CPU的I/O空間就只有64KB(0-0xffff)。這是"I/O對映方式"的一個主要缺點。
Linux將基於I/O對映方式的或記憶體對映方式的I/O埠通稱為"I/O區域"(I/O region)。
===============================================================================
1、外設都是通過讀寫裝置上的暫存器來進行的,外設暫存器也稱為"I/O埠",而IO埠有兩種編址方式:獨立編址和統一編制。而具體採用哪一種則取決於CPU的體系結構。 如,PowerPC、m68k等採用統一編址,而X86等則採用獨立編址。但對於Linux核心而言,它可能用於不同的CPU,所以它必須都要考慮這兩種方式,於是它採用一種新的方法,將基於I/O對映方式的或記憶體對映方式的I/O埠通稱為"I/O區域"(I/O region),不論你採用哪種方式,都要先申請IO區域:request_resource(),結束時釋放它:release_resource()。
對於某一既定的系統,它要麼是獨立編址,也即"I/O埠"方式,外設暫存器位於"I/O空間";要麼是統一編制,也即"I/O記憶體"方式,外設暫存器位於"記憶體空間"(很多外設有自己的記憶體、緩衝區,外設的暫存器和記憶體統稱"I/O空間")。
2、對外設的訪問分為IO埠訪問和IO記憶體訪問。
訪問IO記憶體的流程是:request_mem_region() -> ioremap() -> ioread8()/iowrite8() -> iounmap() -> release_mem_region() 。
訪問IO埠有2種途徑,I/O對映方式(I/O-mapped)、記憶體對映方式(Memory-mapped)。前一種途徑直接使用intb()/outb()之類的函式來讀寫IO埠,後一種是(為了達到介面的同一性)先把IO埠對映到IO記憶體("記憶體空間"):ioport_map(),再使用訪問IO記憶體的函式來訪問IO埠。