linux裝置驅動 IO Port

2021-05-22 07:23:21 字數 1651 閱讀 1361

1. i/o port

和硬體打交道離不開i/o port

,老的isa

裝置經常是占用實際的

i/o埠,在

linux

下,作業系統沒有對

i/o口遮蔽,也就是說,任何驅動程式都可對任意的

i/o口操作,這樣就很容易引起混亂。每個驅動程式應該自己避免誤用埠。 

有兩個重要的kernel

函式可以保證驅動程式做到這一點。  1

)check_region(int io_port

, int off_set) 

這個函式察看系統的i/o

表,看是否有別的驅動程式占用某一段

i/o口。 

引數1:i/o

埠的基位址, 

引數2:i/o

埠占用的範圍。 

返回值:0 

沒有占用, 非

0,已經被占用。  2

)request_region(int io_port

, int off_set

,char *devname) 

如果這段i/o

埠沒有被占用,在我們的驅動程式中就可以使用它。在使用之前,必須向系統登記,以防止被其他程式占用。登記後,在

/proc/ioports

檔案中可以看到你登記的

i/o口。 

引數1:io

埠的基位址。 

引數2:io

埠占用的範圍。 

引數3:使用這段

io位址的裝置名。 

在對i/o

口登記後,就可以放心地用

inb()

, outb()

之類的函來訪問了。 

在一些pci

裝置中,

i/o埠被對映到一段記憶體中去,要訪問這些埠就相當於訪問一段記憶體。經常性的,我們要獲得一塊記憶體的實體地址。

2.記憶體操作

在裝置驅動程式中動態開闢記憶體,不是用malloc

,而是kmalloc

,或者用

get_free_pages

直接申請頁。釋放記憶體用的是

kfree

,或free_pages

。 請注意,

kmalloc

等函式返回的是實體地址! 

注意,kmalloc最大只能開闢

128k-16,16

個位元組是被頁描述符結構占用了。 

記憶體對映的i/o

口,暫存器或者是硬體裝置的

ram(

如視訊記憶體)

一般占用

f0000000

以上的位址空間。在驅動程式中不能直接訪問,要通過

kernel

函式vremap

獲得重新對映以後的位址。 

另外,很多硬體需要一塊比較大的連續記憶體用作dma

傳送。這塊程式需要一直駐留在記憶體,不能被交換到檔案中去。但是kmalloc

最多只能開闢

128k

的記憶體。 

這可以通過犧牲一些系統記憶體的方法來解決。 

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動

一.簡介 作業系統是通過各種驅動程式來駕馭硬體裝置,它為使用者遮蔽了各種各樣的裝置,驅動硬體是作業系統最基本的功能,並且提供統一的操作方式。正如我們檢視螢幕上的文件時,不用去管到底使用nvidia晶元,還是ati晶元的顯示卡,只需知道輸入命令後,需要的文字就顯示在螢幕上。硬體驅動程式是作業系統最基本...

linux裝置驅動

1 flash的程式設計原理都是只能將1寫為0,而不能將0寫為1。所以在flash程式設計之前,必須將對應的塊擦除,而擦除的過程就是把所有位都寫為1的過程,塊內的所有位元組變為0xff。2 nand flash與nor flash相比容量大 低 nand flash中每個塊的最大擦寫次數是100萬次...