歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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.ko的kenerl 不是我的pc的kenerl版本。 

執行命令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.linuxidc.com/Linux/2013-07/87189.htm

在X86上我的辦法是:

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

Copyright © Linux教程網 All Rights Reserved