设为首页 收藏本站
查看: 971|回复: 0

[经验分享] 转载只为记录经典之

[复制链接]

尚未签到

发表于 2016-3-16 12:40:52 | 显示全部楼层 |阅读模式
Linux驱动程序编写演示----编译驱动程序

标签:linux


Linux驱动程序编写演示----编译驱动程序
1驱动编写:
#include <linux/init.h>
#include <linux/module.h>
static int __init test_driver_init(void)
{
/* register this driver */
printk("Hello test_driver , init this driver");
return 0;
}
static void __exit test_driver_exit(void)
{
/* deregister this driver*/
printk("Good bye test_driver, exit this driver");
}
module_init(test_driver_init);
module_exit(test_driver_exit);
MODULE_LICENSE("GPL");

编译驱动程序
编译驱动程序,有两种方法,一是在代码目录下,进行单独编译;二是加入内核编译的菜单里。针对我们所写的驱动程序test_driver,分别来使用两种方法进行编译。


2、单独编译驱动文件
当内核已经稳定的运行后,以模块的方式运行驱动时,可以采用单独编译驱动的方式。
需要自己动手写Makefile文件,内容如下:
obj-m := test_driver.o #告诉make在编译的时候,编译成模块,得到test_driver.ko
KERNELDIR := /usr/local/arm/kernel/linux-2.6.30 #把源码的路径设置好
defualt:
$(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules #make不带参数时,运行这里
install:
insmod test_driver.ko
uninstall:
rmmod test_driver.ko
clean:
$(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean
这个Makefile文件很简单,保存后,回到命令行,直接键入make回车,就可以编译了。编译完成,得到test_driver.ko文件,和源码是一个路径(这是用M=$(shell pwd)指定的。
错误:
make -C /usr/local/arm/kernel/linux-2.6.30 M=/home/driver_test modules
make[1]: Entering directory `/usr/local/arm/kernel/linux-2.6.30'
CC [M] /home/driver_test/test_driver.o
In file included from include/linux/gfp.h:4,
from include/linux/kmod.h:22,
from include/linux/module.h:13,
from /home/driver_test/test_driver.c:2:
include/linux/mmzone.h:18:26: error: linux/bounds.h: No such file or directory
include/linux/mmzone.h:256:5: warning: "MAX_NR_ZONES" is not defined
In file included from include/linux/gfp.h:4,
from include/linux/kmod.h:22,
from include/linux/module.h:13,
from /home/driver_test/test_driver.c:2:
include/linux/mmzone.h:290: error: 'MAX_NR_ZONES' undeclared here (not in a function)
make[2]: *** [/home/driver_test/test_driver.o] 错误 1
make[1]: *** [_module_/home/driver_test] 错误 2
make[1]: Leaving directory `/usr/local/arm/kernel/linux-2.6.30'
make: *** [defualt] 错误 2
解决方法:
在/usr/local/arm/kernel/linux-2.6.30目录下执行
# make prepare

驱动文件与内核一起编译
1、加入到menuconfig中编译
这个方式,是编译内核时,在源码顶层目录下运行make menuconfig命令时,在菜单中可以看到我们自己的驱动程序,
这样可以采取与内核及其他驱动程序统一进行编译。采用以下几个步骤来完成:
(1)修改我们自己的Makefile文件
obj-m := test_driver.o
obj-$(CONFIG_TEST_DRIVER) +=test_driver.o
在原来的基础上,只保留上面两行内容。
(2)增加一个Kconfig文件
这个文件在我们自己的源码路径下创建,内容如下:
config TEST_DRIVER
tristate " Test Driver for Linux"
default n
help
This item is just for linux driver demo and
test linux menuconfig, do nothing
简单说明:
config是Kconfig文件语言的关键字,TEST_DRIVER是我们自己定义的变量,它的值是y,n,M三个值中的一个。我们上面缺省的语句,default n,就是默认情况下,CONFIG_TEST_DRIVER=n,前缀CONFIG_,这是系统自己加上的。
tristate是关键字,其后面是我们自己写的菜单上出现的提示。整句的含义是," Test Driver for Linux "这个选择项,是3态的,即:y,n,M。



(3)修改arch/arm下的Kconfig文件
经过前面2个步骤的修改,内核配置菜单,还是找不到我们的代码路径,还需要在架构路径下进行添加,方法是在endmenu之前,加入:source "/home/driver_test/kconfig",这样做之后,架构下arm的Kconfig就可以找到我们自己的Kconfig了。类似这样:

#this is test_driver
source "/home/driver_test/Kconfig"

(4)修改drivers/Makefile文件
Kconfig文件相当于给Makefile文件提供一个目录上路由功能,具体的编译工作,还是必须由Makefile来指定规则的。该Makefile文件上添加一句:
#this is driver_test
obj-$(CONFIG_TEST_DRIVER) +=/home/driver_test

经过上面四个步骤的修改,我们的驱动程序代码就加入了内核统一编译的菜单中去了。如图:

配置完成后,命令行运行make开始编译,之后可以在我们的源码路径下找到编译成功的test_driver.ko文件。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-191392-1-1.html 上篇帖子: NamedManager安装Web管理bind9的DNS服务器 下篇帖子: Linux下文本文件中^M 符号问题的解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表