暫存器與記憶體
暫存器與記憶體的區別在哪里呢?
暫存器和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記憶體
步驟:
1、 申請
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)
寫IO記憶體
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/349466.html
標籤:其他
