1. 程式人生 > >13 Linux裝置驅動基礎知識

13 Linux裝置驅動基礎知識

Linux裝置驅動基礎知識


驅動是硬體與使用者程序之間的通訊橋樑。

使用者程序是不可以直接訪問硬體的。
資料是驅動先接收到硬體反饋的資料處理後再移交給使用者程序的。

驅動不屬於任何一個使用者程序,可以給多個使用者程序呼叫。
驅動是常駐於記憶體裡,等待使用者程序呼叫。

使用者程序如訪問越界則會發生段錯誤,但對其它程序沒有影響。
使用者程序在cpu的usr模式下工作。
驅動是在svc模式下工作(特權模式),驅動發生錯誤,會影響整個系統(像windows系統藍屏)。
寫應用程式有bug僅僅是影響該程序,但寫驅動時,有可能會導致系統崩潰。

驅動載入到核心後(即驅動工作時),除了初始化工作以外,一般情況下是不會自動去執行操作的,驅動是在被使用者程序呼叫時才會觸發操作的,所以也得注意驅動的介面函式的可重入性;
也就是,驅動是實現硬體的各種功能,但怎麼去使用則由使用者程序呼叫來決定。

驅動要注意可移植性,驅動裡用的棧是定長的(8K), 所以在使用大的緩衝區時需要動態申請(kmalloc/vmalloc)。

C庫函式不能在核心驅動裡呼叫,因為C庫需要通過系統呼叫來實現功能;
但在核心裡有實現大部分C庫的基本功能函式,如核心裡的printk可代替C的printf函式
(cat /proc/kallsyms | grep 函式名 //可檢視當前核心裡是否有提供此功能函式)

核心使用面向物件的做法來實現裝置驅動方法的,如用struct cdev的一個變數來描述一個字元裝置驅動。


核心原始碼的目錄:

arch 
arm 
mach-sunxi:每個cpu型號都會有mach-xxxx的目錄,此目錄裡會有幾個C檔案,這些檔案表示基於這個cpu所做的方案,原始碼裡大多是用於描述此方案的硬體資源(如:sun4i.c
, sun6i.c, sun8i.c…) block:實現塊裝置的介面與管理,大容量的儲存裝置(如:SD, nand, emmc) cypto:加密演算法 Documentation:文件 drivers:硬體的驅動 firmware:韌體,提供給外接晶片啟動時載入的程式,如wifi模組(zd1211) fs:檔案系統格式 init:核心啟動時初始化的程式碼 ipc:程序間通訊的實現功能程式碼 kernel:裡面實現程序排程的功能 mm:記憶體管理 net:網路協議棧的實現 scripts:配置核心make menuconfig時產生介面的指令碼 sound:音效卡驅動相關

核心起用介面標準化的作用,即核心裡制定了驅動的介面及應用程式的呼叫介面。
只要雙方都遵循標準的介面,雙方就可以實現通訊,而不用管具體一方是什麼樣,怎樣實現的。