閱讀662 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《LINUX設備驅動程序》學習劄記(一)

總結章節:第一章 設備驅動程序簡介

          第二章 構造和運行模塊

提到驅動程序就不得不先說下兩個名詞:內核空間和用戶空間。用戶空間即用戶應用所運行的空間,內核空間值得是操作係統內核運行的空間。用戶空間不能直接引用或者操作內核空間的數據,內核空間也不能直接引用用戶空間的數據。操作係統內核對整個係統資源進行管理,這些資源中也包括硬件資源。所以用戶空間也不能直接訪問硬件資源。驅動為用戶訪問特定的硬件資源提供接口。用戶空間要訪問硬件資源則隻需要調用驅動所提供的接口。驅動完全屏蔽了內部操作。從而,用戶空間通過驅動這層特殊的內核間接的訪問硬件資源。

驅動的作用在於提供機製,機製即:需要提供什麼功能,而不是提供策略,策略即:如何使用這些功能。提供機製是驅動程序的任務,而策略則是應用程序所要完成的任務。由於不同的環境會有不同的方式來訪問硬件,作為驅動程序的編寫者,應該盡量做到使驅動不到策略,在編寫驅動的時候,程序員還應該特別注意,編寫訪問硬件的內核代碼,不要給用戶強加任何特定策略。因為不同的用戶會有不同的需求。

內核的功能分為:進程管理,內存管理,文件係統,設備控製,網絡功能。所有設備控製操作都由與被控製設備相關代碼來完成,這段代碼就叫驅動程序,充分說明驅動程序是內核的一部分。

既然驅動程序是內核的一部分,那麼驅動程序的編寫就需要用到內核的頭文件,對於Linux 2.6版本的內核驅動程序還需要依賴內核源碼樹。所以在編寫驅動之前,要弄清楚,自己編寫的驅動實際就是在編寫內核,那麼程序中所有用到的頭文件都是內核的。

內核源碼樹的路徑可以用一下命令查看:

# cd /lib/modules/$(uname -r)/build/ # pwd

現在編寫一個簡單的 HelloWorld 程序來說明

#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE(“Dual MPL/GPL”); static int hello_init(void) { printk(KERN_ALERT “Hello, world/n”); return 0; } static void hello_exit(void) { printk(KERN_ALERT “Goodbye cruel world/n”); } 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 的路徑就可以了。

另外需要提的是驅動一旦在內核中注冊了,那麼其他的程序就可以使用該設備了,所以,千萬不要再驅動內部初始化完成之前就在內核中注冊該驅動。當驅動程序出錯了,我們應該向內核注銷該驅動程序。

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/02/07/5297188.aspx

並請聯係譚海燕本人或者前往譚海燕個人主頁留言

最後更新:2017-04-02 04:01:46

  上一篇:go 生命之偉大的事業
  下一篇:go linux線程同步之條件變量