核心空間和硬體裝置之間的介面函數
在核心空間也有一些函數來控制裝置或者用於核心和硬體之間的資訊交換,下表闡述了這些概念.這個表也會隨著一些概念的引入而完善.
Events |
Kernel functions |
Read data |
|
Write data |
|
表 裝置驅動事件和與之相聯絡的介於核心空間和硬體裝置之間的函數
第一個驅動程式:在使用者空間載入和卸載驅動
我將給你示範如何開發你的第一個Linux裝置驅動,這個驅動將會以模組的形式載入到核心。
為了達到以上目的,我將編寫如下的程式,並將其命名為nothing.c
#include<linux/module.h>
MODULE_LICENSE("DualBSD/GPL");
因為目前核心的發行版本是2.6.x,所以編譯模組已經變得稍微複雜一些了。首先,你需要有一個完整的,被編譯過的核心源碼樹。如果你有一個Debian Sarge系統,你可以按照附錄B的步驟來完成(在本文章的後面)。在以後,我將假定你使用的是2.6.8的核心版本。
然後,你需要編寫一個makefile檔案,對於我們當前的這個例子來說,我們應該編寫一個名為“Makefile”的檔案,它的內容如下:
obj-m := nothing.o
和以往的核心版本不同,根據你準備將之後產生的模組用在哪個版本的核心中,你在編譯這個模組的時候就必須使用和你這個目標核心相同的核心。為了編譯它,你可以鍵入下面的命令:
$ make -C/usr/src/kernel-source-2.6.8 M=pwd modules
這個非常簡單的模組屬於核心空間,在它被載入的時刻起它就成為了核心的一部分。在使用者空間,你可以以root使用者的許可權鍵入以下命令列載入這個模組:
# insmod nothing.ko
使用insmod命令可以將這個模組安裝到核心。但是,實際上這個特殊的模組本身並沒有很大的用處。
為了檢查我們的模組是否正確安裝,我們可以鍵入以下命令來查看所有我們已經安裝好的模組:
# lsmod
最後,我們可以使用以下命令來移除我們已經安裝的模組:
# rmmod nothing
現在,通過再次鍵入lsmod命令,你可以確認這個模組在核心中已經不存在了。
所有的總結到以下表中為:
Events |
User functions |
Kernel functions |
Load module |
Insmod |
|
Open device |
|
|
Read device |
|
|
Write device |
|
|
Close device |
|
|
Remove module |
rmmod |
|
表 裝置驅動事件和與對應的在使用者空間和核心空間的互動函數