linux下編譯運行驅動

 

 

linux下編譯運行驅動

嵌入式linux下設備驅動的運行和linux x86 pc下運行設備驅動是類似的,由於手頭沒有嵌入式linux設備,先在vmware上的linux上學習驅動開發。

按照如下方法就可以成功編譯出hello world模塊驅動。

1、首先確定本機linux版本

怎麼查看Linux的內核kernel版本?

'uname'Linux/unix系統中用來查看系統信息的命令,適用於所有Linux發行版。配合使用'uname'參數可以查看當前服務器內核運行的各個狀態。

#uname -a

Linux whh 3.5.0-19-generic #30-Ubuntu SMPTue Nov 13 17:49:53 UTC 2012 i686 i686 i686 GNU/Linux

 

只打印內核版本,以及主要和次要版本:

#uname -r

3.5.0-19-generic

 

要打印系統的體系架構類型,即的機器是32位還是64位,使用:

#uname -p

i686

 

/proc/version 文件也包含系統內核信息:

# cat /proc/version

Linux version 3.5.0-19-generic(buildd@aatxe) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #30-UbuntuSMP Tue Nov 13 17:49:53 UTC 2012

 

發現自己的機器linux版本是:3.5.0-19-generic

2、下載機器內核對應linux源碼

到下面網站可以下載各個版本linux源碼https://www.kernel.org/

如我的機器3.5.0版本源碼下載地址爲:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2

下載完後,找一個路徑解壓,如我解壓到/linux-3.5/

然後很重要的一步是:執行命令uname -r,可以看到Ubuntu的版本信息是3.5.0-19-generic

。進入linux源碼目錄,編輯Makefile,將EXTRAVERSION =  修改爲EXTRAVERSION= -19-generic

這些都是要配置源碼的版本號與系統版本號,如果源碼版本號和系統版本號不一致,在加載模塊的時候會出現如下錯誤:insmod: error inserting 'hello.ko': -1 Invalid module format

原因很明確:編譯時用的hello.kokenerl 不是我的pckenerl版本。

 

執行命令cp /boot/config-3.5.0-19-generic ./config,覆蓋原有配置文件。

進入linux源碼目錄,執行make menuconfig配置內核,執行make編譯內核。

 

 

 

3、寫一個最簡單的linux驅動代碼hello.c

 

/*======================================================================

    Asimple kernel module: "hello world"

======================================================================*/

#include <linux/init.h>

#include <linux/module.h>

MODULE_LICENSE("zeroboundaryBSD/GPL");

static int hello_init(void)

{

         printk(KERN_INFO"Hello World enter\n");

         return0;

}

 

static void hello_exit(void)

{

         printk(KERN_INFO"Hello World exit\n ");

}

 

module_init(hello_init);

module_exit(hello_exit);

 

MODULE_AUTHOR("zeroboundary");

MODULE_DESCRIPTION("A simple HelloWorld Module");

MODULE_ALIAS("a simplestmodule");

 

4、寫一個Makefile對源碼進行編譯

KERN_DIR = /linux-3.5

all:

         make-C $(KERN_DIR) M=`pwd` modules

clean:

         make-C $(KERN_DIR) M=`pwd` clean

 

obj-m += hello.o

 

5、模塊加載卸載測試

insmod hello.ko

rmmod hello.ko

 

然後dmesg|tail就可以看見結果了

                             

 

最後,再次編譯驅動程序hello.c得到hello.ko。執行insmod ./hello.ko,即可正確insert模塊。

 

使用insmod hello.ko 將該Module加入內核中。在這裏需要注意的是要用 su 命令切換到root用戶,否則會顯示如下的錯誤:insmod: error inserting 'hello.ko': -1 Operation not permitted

 

內核模塊版本信息的命令爲modinfo hello.ko

通過lsmod命令可以查看驅動是否成功加載到內核中

通過insmod命令加載剛編譯成功的time.ko模塊後,似乎系統沒有反應,也沒看到打印信息。而事實上,內核模塊的打印信息一般不會打印在終端上。驅動的打印都在內核日誌中,我們可以使用dmesg命令查看內核日誌信息。dmesg|tail

 

 

 

可能還會遇到這種問題insmod: error inserting 'hello.ko': -1 Invalid module format

dmesg|tail查看內核日誌詳細錯誤

disagrees about version of symbolmodule_layout,詳細看這裏。

http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/index.html

X86上我的辦法是:

make -C/usr/src/linux-headers-3.5.0-19-generic SUBDIRS=$PWD modules

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章