第一個linux驅動開發程式Hello World

來源:互聯網
上載者:User

一、原始碼

#include <linux/init.h><br />#include <linux/module.h><br />MODULE_LICENSE("Dual BSD/GPL");<br />static __init int hello_init(void)<br />{<br /> printk(KERN_ALERT "Hello world/n");<br /> return 0;<br />}<br />static __exit int hello_exit(void)<br />{<br /> printk(KERN_ALERT "Goodbye, cruel world/n");<br /> return 0;<br />}<br />module_init(hello_init);<br />module_exit(hello_exit);<br /> 

說明:

1.1 #include <linux/init.h>

該標頭檔定義了模組兒載入module_init和卸載module_exit所需要的核心特定宏定義。

      1.2 #include <linux/module.h>

            該標頭檔定義了模組兒許可證的宏定義:MODULE_LICENSE 

      1.3 MODULE_LICENSE("Dual BSD/GPL");

            該段代碼的作用是告訴核心,該模組兒採用自由許可證;如果沒有這樣的生命,核心在裝載時可能會產生抱怨。

      1.4 static __init int hello_init(void)

{

        printk(KERN_ALERT "Hello world/n");

        return 0;

}

初始化函數應該被聲明為static,因為在該模組兒之外沒有什麼意義。

__init標記對核心來講是一種暗示,表明該函數只在初始化期間使用。模組兒被裝載後,模組兒裝載器就會將初始化函數扔掉,將該函數佔用的記憶體釋放掉。

printk是核心列印函數。

1.5 static __exit int hello_exit(void)

{

        printk(KERN_ALERT "Goodbye, cruel world/n");

        return 0;

}

__exit標記改代碼僅用於模組卸載。說明該函數只能在模組兒被卸載或者系統關閉的時候被調用。如果模組兒是直接內嵌到核心中的,則會將標記為__exit的函數簡單的丟棄掉。

1.6 module_init(hello_init);

該宏會在模組兒的目標代碼中增加一個特殊的段,用於說明內和初始化函數所在地位置,沒有這個定義,初始化函數永遠不會被調用到。

1.7 module_exit(hello_exit);

該宏用於協助核心找到模組兒的清除函數。

 

二、Makefile

obj-m := hello.o<br />KDIR := /lib/modules/$(shell uname -r)/build<br />PWD := $(shell pwd)<br />all: modules<br />modules:<br /> make -C $(KDIR) M=$(PWD) modules<br />clean:<br /> rm -rf *.ko *.mod.c *.mod.o Module.*<br /> 

2.1 在編譯核心模組兒之前,應確保具備了正確版本的編譯器、模組工具等,並且擁有核心樹。一般我們不需要為此擔心,因為我們的檔案系統已經具備2.6版本的核心樹,除非你的linux版本還很老。

2.2 obj-m 用來定義哪些檔案被編譯成可載入模組。obj-m中定義的.o檔案由目前的目錄下的.c或者.S檔案編譯產生。一個模組可以由一個或者幾個.o檔案組成。對於只有一個源檔案的模組,在obj-m中直接增加它的.o檔案即可。對於有多個源檔案的模組,除在obj-m中增加一個.o檔案外,還要定義一個<module_name>-objs變數來告訴Makefile這個.o檔案由哪些檔案組成。例如:模組名為test。並且有兩個檔案file1.c和file2.c。則應該為

obj-m := test.o

test-objs := file1.o file2.o

2.3 KDIR定義了核心原始碼數目錄。改名字可隨便去,一般大寫。比較通用的目錄位址為:/lib/modules/$(shell uname -r)/build,其中uname -r命令輸出核心版本資訊。

2.4 PWD定義了當前模組源檔案的目錄

2.5 modules定義了make命令:make -C $(KDIR) M=$(PWD) modules。其中-C選項指定核心原始碼目錄。M=選項讓該Makefile在構造modules目標之前返回到模組原始碼目錄。modules目標指向obj-m變數中設定的模組。

 

三、運行

3.1 在Makefile所在目錄運行make命令。會產生<modules>.ko檔案,例如本例中的hello.ko。附帶其他一些中間檔案。

3.2 運行insmod hello.ko,就可以將模組載入到核心中。但是我們看到Hello world並沒有輸出,這是因為我們使用的是虛擬終端,結果輸出到了系統記錄檔裡邊。例如/var/log/messages中,可使用tailf /var/log/messages查看。

3.3 卸載模組hello.ko時,會輸出Goodbye, cruel world到/var/log/messages檔案中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.