要編寫linux驅動程式,首先要在自己的系統中配置並構造好核心樹。
將光碟上的 kernel-2.6.15-1.2054_fc5.src.rpm 拷貝到 /usr/src 目錄下。
# rpm -i kernel-2.6.15-1.2054_fc5.src.rpm
# cd /usr/src/redhat/specs
# ls
kernel-2.6.spec
# rpmbuild -bp --target i686 kernel-2.6.spec
# cd ..
# cd build
# ls
kernel-2.6.15
# cd kernel-2.6.15
# ls
config.mk linux-2.6.15.i686 vanilla xen xen-vanilla
# cd linux-2.6.15.i686
這裡就是linux的核心樹了。
接下來是編譯核心,一定要編譯核心,否則無法編譯驅動程式。
# make
乙個小時後核心就編譯好了。
# cd /usr/src
# ln -s /usr/src/redhat/build/kernel-2.6.15/linux-2.6.15.i686 linux
建立乙個符號連線,這樣就可以通過 /usr/src/linux 直接訪問核心樹了。
好了,現在可以開始編寫核心模組了。
讓我們從hello world 開始吧。
/*hello.c*/
#include
#include
#include
module_license("dual bsd/gpl");
static int hello_init(void)
static void hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
這個模組什麼也不做,只是在載入時顯示"hello,world",解除安裝時顯示"goodbye world"。
這個模組定義了兩個函式,其中乙個在模組被裝載到核心時呼叫hello_init(),而另乙個則在模組被移出時呼叫hello_exit()。
module_init 和 module_exit 行使用了核心的特殊巨集來表示上述兩個函式所扮演的角色。另外乙個巨集 module_license 用來告訴核心,該模組採用自由許可證,如果沒有這樣的宣告,核心在裝載該模組時會產生抱怨。函式printk()在 linux/kernel.h 中定義,功能和標準c庫函式printf()類似。需要說明一點,寫核心或核心模組不能用寫應用程式時的系統呼叫或函式庫,因為我們寫的就是為應用程式提供系統呼叫的**。核心有專用的函式庫,如, , 等。kern_alert 定義了這條訊息的優先順序,我們需要在模組**中顯示地指定高優先順序的原因在於:具有預設優先順序的訊息可能不會輸出在控制台上。需要特別指出的是,printk 只能輸出到文字控制台上,圖形介面下的終端**器是不會看到printk 的輸出的。
接下來是編寫makefile:
target = hello
kdir = /usr/src/linux
pwd = $(shell pwd)
obj-m := $(target).o
default:
make -c $(kdir) m=$(pwd) modules
輸入:# make
好了模組已經編譯好了,輸入ls -a 可以看到hello.ko,現在就讓我們來載入這個模組看看效果,按 ctrl+alt+f2 切換到文字介面,輸入root 和密碼,cd 到hello.ko 所在目錄。
# in**od ./hello.ko
hello world
# rmmod hello
goodbye world
我們已經看到,編寫乙個模組並沒有現象的那麼困難——至少當模組不需要完成什麼有價值的工作時。真正的困難在於理解裝置並最大化其效能。
Linux驅動學習筆記(1)
學習linux驅動開發,自然離不開核心模組,核心模組似乎是專門為linux驅動開發而出現的。但是並不是說核心模組都是驅動,只是核心模組作為一種動態擴充套件核心,是方便了驅動的開發。那麼乙個模組是怎麼樣的呢?很簡單,三要素 標頭檔案 載入函式 解除安裝函式 include include static...
linux驅動學習筆記
1.先從最簡單的例子開始 include include module license dual bsd gpl static int hello init void printk kern alert hello,world n return 0 static void hello exit vo...
Linux裝置驅動程式學習筆記1
系統linux2.6.32.2 arm linux gcc 4.3.2 hello world模組 include include static int hello init void static void hello exit void module init hello init module...