總結章節:第一章 裝置驅動程式簡介
第二章 構造和執行模組
提到驅動程式就不得不先說下兩個名詞:核心空間和使用者空間。使用者空間即使用者應用所執行的空間,核心空間值得是作業系統核心執行的空間。使用者空間不能直接引用或者操作核心空間的資料,核心空間也不能直接引用使用者空間的資料。作業系統核心對整個系統資源進行管理,這些資源中也包括硬體資源。所以使用者空間也不能直接訪問硬體資源。驅動為使用者訪問特定的硬體資源提供介面。使用者空間要訪問硬體資源則只需要呼叫驅動所提供的介面。驅動完全遮蔽了內部操作。從而,使用者空間通過驅動這層特殊的核心間接的訪問硬體資源。
驅動的作用在於提供機制,機制即:需要提供什麼功能,而不是提供策略,策略即:如何使用這些功能。提供機制是驅動程式的任務,而策略則是應用程式所要完成的任務。由於不同的環境會有不同的方式來訪問硬體,作為驅動程式的編寫者,應該盡量做到使驅動不到策略,在編寫驅動的時候,程式設計師還應該特別注意,編寫訪問硬體的核心**,不要給使用者強加任何特定策略。因為不同的使用者會有不同的需求。
既然驅動程式是核心的一部分,那麼驅動程式的編寫就需要用到核心的標頭檔案,對於linux 2.6版本的核心驅動程式還需要依賴核心原始碼樹。所以在編寫驅動之前,要弄清楚,自己編寫的驅動實際就是在編寫核心,那麼程式中所有用到的標頭檔案都是核心的。
核心原始碼樹的路徑可以用一下命令檢視:
# cd /lib/modules/$(uname -r)/build/
# pwd
現在編寫乙個簡單的helloworld程式來說明
#include
#include
module_license(「dual mpl/gpl」);
static int hello_init(void)
static void hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
下面是makefile檔案內容
obj-m = hello.o
kerneldir ?= /lib/modules/$(uname -r)/build
makefile**解釋:
obj-m是核心要求的。驅動最終hello.ko依賴於hello.o檔案
下面的一句就是制定核心樹。如果驅動目標平台不是當前平台,只需要更改kerneldir的路徑就可以了。
另外需要提的是驅動一旦在核心中註冊了,那麼其他的程式就可以使用該裝置了,所以,千萬不要再驅動內部初始化完成之前就在核心中註冊該驅動。當驅動程式出錯了,我們應該向核心登出該驅動程式。
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...
Linux裝置驅動程式
linux系統中的裝置分為字元裝置 char device 塊裝置 block 和網路裝置 net device 三種,字元裝置是指在訪問時沒有快取,能夠像檔案一樣被訪問的裝置,字元裝置驅動程式至少要實現open close read和write系統呼叫。多數的linux裝置驅動程式可以在核心模組發...