歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下的硬件訪問方法

Linux下的硬件訪問方法

日期:2017/3/1 10:22:36   编辑: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