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萬次...