歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux下的硬件訪問方法

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)

Copyright © Linux教程網 All Rights Reserved