欢迎来到天天文库
浏览记录
ID:26791904
大小:70.00 KB
页数:10页
时间:2018-11-29
《linux驱动程序开发》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux驱动程序开发-驱动程序基本框架育龙网 WWW.CHINA-B.C0M 2009年06月11日 来源:互联网育龙网核心提示:前言不管是Windows还是Linux,驱动程序都扮演着重要的角色。应用程序只能通过驱动程序才能同硬件设备或系统内核通讯。Linux内核对不管是Windows还是Linux,驱动程序都扮演着重要的角色。应用程序只能通过驱动程序才能同硬件设备或系统内核通讯。Linux内核对不同的系统定义了标准的接口(API),应用程序就是通过这些标准的接口来操作内核和硬件。驱动可以被编译的内核中(build-i
2、n),也可以做为内核模块(Module)存在于内核的外面,需要的时候动态插入到内核中运行。就像你学习操作系统概念时所了解的那样,Linux内核也分为几个大的部分:进程管理、内存管理、文件系统、设备控制、网络系统等,参考图1-1。这里就不对Linux系统内核的各个部分做过多的介绍了,在后面的学习中你就会逐渐地对这些概念有个更深入的了解。其实Linux内核的精髓远不止这些,对于一个Linux内核的爱好者或开发者来说,最好详细的浏览内核源代码,订阅Linux内核相关的邮件列表,或是登陆Linux开发社区。更多的信息,请登陆Linux
3、内核官方网站:http://www.kernel.org一个简单的驱动下面我们来编写第一个驱动程序,它很简单,在运行时会输出‘HelloWorld’消息。//hello.c#include4、k(KERN_ALERT"GoodbyeWorld!");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");这就是一个简单的驱动程序,它什么也没做,仅仅是输出一些信息,不过对于我们来说这已经足够了。保存这个程序,命名为hello.c。在写一个Makefile文件用来编译它,Makefile和hello.c文件保存在同一个目录下。##Makefileifneq($(KERNELRELEASE),)MODULE_NAME=hellowo5、rld$(MODULE_NAME)-objs:=hello.oobj-m:=$(MODULE_NAME).oelseKERNEL_DIR=/lib/modules/`uname-r`/buildMODULEDIR:=$(shellpwd).PHONY:modulesdefault:modulesmodules:make-C$(KERNEL_DIR)M=$(MODULEDIR)modulescleandistclean:rm-f*.o*.mod.c.*.*.cmd*.korm-rf.tmp_versionsendif编译并运行这6、个模块://需要root权限来运行makeinsmodhelloworld.kormmodhelloworld.ko尽管我们对它的一些细节还不够了解,它确实神奇的工作了,这个HelloWorld信息输出到了屏幕终端上,你可以通过运行dmesg来看到这些信息。驱动基础我们通过分析上面的代码来了解一个驱动程序的基本概念。头文件就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件,大多的Linux驱动程序需要包含下面三个头文件:#include7、module.h#include8、ERN_ALERT"HelloWorld!");return0;}module_init(hello_init);__init宏告诉编译器如果这个模块被编译到内核则把这个函数放到(.init.text)段,这样当函数初始化完成后这个区域可以被清除掉以节约系统内存。Kenr
4、k(KERN_ALERT"GoodbyeWorld!");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");这就是一个简单的驱动程序,它什么也没做,仅仅是输出一些信息,不过对于我们来说这已经足够了。保存这个程序,命名为hello.c。在写一个Makefile文件用来编译它,Makefile和hello.c文件保存在同一个目录下。##Makefileifneq($(KERNELRELEASE),)MODULE_NAME=hellowo
5、rld$(MODULE_NAME)-objs:=hello.oobj-m:=$(MODULE_NAME).oelseKERNEL_DIR=/lib/modules/`uname-r`/buildMODULEDIR:=$(shellpwd).PHONY:modulesdefault:modulesmodules:make-C$(KERNEL_DIR)M=$(MODULEDIR)modulescleandistclean:rm-f*.o*.mod.c.*.*.cmd*.korm-rf.tmp_versionsendif编译并运行这
6、个模块://需要root权限来运行makeinsmodhelloworld.kormmodhelloworld.ko尽管我们对它的一些细节还不够了解,它确实神奇的工作了,这个HelloWorld信息输出到了屏幕终端上,你可以通过运行dmesg来看到这些信息。驱动基础我们通过分析上面的代码来了解一个驱动程序的基本概念。头文件就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件,大多的Linux驱动程序需要包含下面三个头文件:#include7、module.h#include8、ERN_ALERT"HelloWorld!");return0;}module_init(hello_init);__init宏告诉编译器如果这个模块被编译到内核则把这个函数放到(.init.text)段,这样当函数初始化完成后这个区域可以被清除掉以节约系统内存。Kenr
7、module.h#include8、ERN_ALERT"HelloWorld!");return0;}module_init(hello_init);__init宏告诉编译器如果这个模块被编译到内核则把这个函数放到(.init.text)段,这样当函数初始化完成后这个区域可以被清除掉以节约系统内存。Kenr
8、ERN_ALERT"HelloWorld!");return0;}module_init(hello_init);__init宏告诉编译器如果这个模块被编译到内核则把这个函数放到(.init.text)段,这样当函数初始化完成后这个区域可以被清除掉以节约系统内存。Kenr
此文档下载收益归作者所有