linux學習筆記 驅動(1)

2021-04-13 23:53:46 字數 1998 閱讀 2216

要編寫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...