设为首页 加入收藏

TOP

Linux下编译运行驱动
2014-11-24 03:11:47 来源: 作者: 【 】 浏览:1
Tags:Linux 编译 运行 驱动

嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发。


按照如下方法就可以成功编译出hello world模块驱动。


1、首先确定本机linux版本


怎么查看Linux的内核kernel版本


'uname'是Linux/unix系统中用来查看系统信息的命令,适用于所有Linux发行版。配合使用'uname'参数可以查看当前服务器内核运行的各个状态。


#uname -a


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


#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


#include


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就可以看见结果了


Linux下编译运行驱动


最后,再次编译驱动程序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查看内核日志详细错误


在X86上我的办法是:


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 更新UI的两个方法 下一篇解析 Linux 内核可装载模块的版本..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ 语言社区-CSDN社 (2025-12-24 17:48:24)
·CSDN问答专区社区-CS (2025-12-24 17:48:22)
·C++中`a = b = c`与` (2025-12-24 17:48:19)
·C语言结构体怎么直接 (2025-12-24 17:19:44)
·为什么指针作为c语言 (2025-12-24 17:19:41)