1,IO空間:X86一個特有的空間,與內存空間獨立的空間,同樣利用IO空間可以操作數據,只不過是利用對應的IO端口操作函數,例如inb(), inbw(), inl(); outb(), outw(), outl()等。
2,內存空間:內存地址的尋址范圍,例如32位操作系統內存空間為2的32次冪,即4G。
3,IO端口:當外部寄存器或內存映射到IO空間時,即只能用IO端口操作函數進行數據讀寫,稱為IO端口。
4,IO內存:當外部寄存器或內存映射到內存空間時,即使用訪問內存的方式對外部寄存器或者內存進行讀寫操作。
從上面定義可以看出,外部設備只能通過設備上的寄存器或者內存(SRAM?DRAM?)與CPU進行通訊,外部設備的寄存器可以是IO端口(映射到IO空 間),也可以是IO內存(映射到地址空間)。當映射到IO空間時,必須使用對應的IO操作函數;映射到內存空間時就要注意要使用特定的IO內存操作函數, 最好不要直接使用指針操作,IO內存操作函數有如下:
IO內存讀函數:
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
IO內存寫函數:
unsigned int iowrite8(u8 value, void *addr);
unsigned int iowrite16(u8 value, void *addr);
unsigned int iowrite32(u8 value, void *addr);
以下這些函數讀和寫一系列值到給定的I/O內存區域,從給定的buf讀或寫count個值到addr,參數count表示要讀寫的數據個數,而不是字節數
void ioread8_rep(void *addr, void *buf, unsigned long count);
void ioread16_rep(void *addr, void *buf, unsigned long count);
void ioread32_rep(void *addr, void *buf, unsigned long count);
void iowrite8_rep(void *addr, const void *buf, unsigned long count);
void iowrite16_rep(void *addr, const void *buf, unsigned long count);
void iowrite32_rep(void *addr, const void *buf, unsigned long count);
需要操作一塊IO地址時,使用下列函數(這些函數的行為類似於它們的C庫類似函數)
void memcpy_io(void *addr, u8 value, unsigned int count);
void memcpy_fromio(void *dest, void *source, unsigned int count);
void memcpy_fromio(void *dest, void *source, unsigned int count);
由於邊際效應的緣故,不管是否需要 ioremap,都不鼓勵直接使用I/O內存指針,而應使用專門的I/O內存操作函數。這些I/O內存操作函數不僅在所有平台上是安全,而且對直接使用指針操作 I/O 內存的情況進行了優化。 --->《LDD》Chapter 9, Page 249