寄存器與記憶體
寄存器與記憶體的差別在哪裡呢?
寄存器和RAM的主要不同在于寄存器操作有副作用(side effect或邊際效果):
讀取某個位址時可能導緻該位址内容發生變化,比如很多裝置的中斷狀态寄存器隻要一讀取,便自動清零。
記憶體與IO
在X86處理器中存在IO空間的概念,IO空間是相對記憶體空間而言的,他們是彼此獨立的位址空間,在32位的x86系統中,IO空間大小隻有64K,記憶體卻有4G
X86 支援記憶體空間、IO空間
ARM 隻支援記憶體空間
MIPS 隻支援記憶體空間
PowerPC 隻支援記憶體空間
IO端口:
當一個寄存器或記憶體位于IO空間時,稱其為IO端口。
IO記憶體:
當一個寄存器或記憶體位于記憶體空間時,稱其為IO記憶體。
操作I/O端口
對I/O端口的操作需按如下步驟完成:
1、 申請
2、 通路
3、 釋放
申請I/O端口
核心提供了一套函數來允許驅動申請他需要的I/O端口,其中核心的函數是:
struct resource *request_region(unsigned long first, unsigned long n, const char *name)
這個函數告訴核心,你要使用從first開始的n個端口,name參數是裝置的名字。如果申請成功,傳回非NULL,如果申請失敗,傳回NULL.
系統中端口的配置設定情況記錄在/proc/ioports中. cat /proc/ioports,如果不能配置設定需要的端口,可以來這裡看看誰在使用。
通路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 long word, unsigned port) 存取32位端口
釋放I/O端口
當用完一組I/O端口(通常在驅動解除安裝的時候),用如下函數把它們返還給系統:
void release_region(unsigned long start, unsigned long n)
操作I/O記憶體
步驟:
2、 映射
3、 通路
4、 釋放
申請I/O記憶體
核心函數為:
Struct resource *request_mem_region(unsigned long start, unsigned long len, char *name)
這個函數申請一個從start開始, 長度為len 位元組的記憶體區。如果成功,傳回非NULL,
否則傳回NULL, 所有已經在使用的I/O記憶體在 /proc/iomem中列出
映射I/O記憶體
在通路IO記憶體之前,必須進行實體位址到虛拟位址的映射,
void *ioremap(unsigned long phys_addr, unsigned long size)
通路IO記憶體
從IO記憶體讀:
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
寫IO記憶體
void iowrite8(u8 value, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)
老版本的I/O記憶體通路函數:
從I/O記憶體讀,
unsigned readb(address)
unsigned readw(address)
unsigned readl(address)
unsigned writeb(unsigned value, address)
unsigned writew(unsigned value, address)
unsigned writel(unsigned value, address)
釋放IO記憶體
IO記憶體不再需要使用時應當釋放,步驟:
1、 void iounmap(void *addr)
2、 void release_mem_region(unsigned long start, unsigned long len)
歡迎交流
如有轉載請注明出處
新浪部落格:http://blog.sina.com.cn/u/2049150530
部落格園:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua