1、 寄存器與內存
寄存器與內存的區別在哪裡呢?
寄存器和RAM 的主要不同在於寄存器操作有副作用(side effect或邊際效果):讀取某個地址時可能導致該地址內容發生變化,比如很多設備的中斷狀態寄存器只要一讀取,便自動清零。
2、 內存與I/O
在X86處理器中存在I/O空間的概念,I/O空間是相對內存空間而言的,他們是彼此獨立的地址空間,在32位的x86系統中,I/O空間大小為64K,內存空間大小為4G。
3、 IO/內存空間
X86:支持內存空間、IO空間
ARM:只支持內存空間
MIPS:只支持內存空間
PowerPC:只支持內存空間
4、 IO端口與IO內存
IO端口:當一個寄存器或內存位於IO空間時,稱其為IO端口。
IO內存:當一個寄存器或內存位於內存空間時,稱其為IO內存。
5、 操作I/O端口
對I/O端口的操作需按如下步驟完成:
1)申請
2)訪問
3)釋放
1)申請I/O端口
內核提供了一套函數來允許驅動申請它需要的I/O端口,其中核心的函數是:
struct resource *request_region(unsigned long first,unsigned long n, const char *name)
這個函數告訴內核,你要使用從first 開始的n個端口,name參數是設備的名字。如果申請成功,返回非NULL,申請失敗,返回NULL。
系統中端口的分配情況記錄在/proc/ioports中(展示)。如果不能分配需要的端口,可以來這裡查看誰在使用。
2)訪問I/O端口
I/O端口可分為8-位, 16-位, 和32-位端口。Linux內核頭文件(體系依賴的頭文件<asm/io.h>) 定義了下列內聯函數來訪問I/O 端口:
unsigned inb(unsigned port) 讀字節端口( 8 位寬)
void outb(unsigned char byte, unsigned port) 寫字節端口( 8 位寬)。
unsigned inw(unsigned port)
void outw(unsigned short word, unsigned port)存取16-位端口。
unsigned inl(unsigned port)
void outl(unsigned longword, unsigned port)存取32-位端口。
3)釋放I/O端口
當用完一組I/O 端口(通常在驅動卸載時),應使用如下函數把它們返還給系統:
void release_region(unsigned long start, unsigned long n)