- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux驱动序开发
Linux驱动程序开发 - 驱动程序基本框架
育龙网?WWW.CHINA-B.C0M?? 2009年06月11日??来源:互联网
育龙网核心提示: 前言 不管是Windows还是Linux,驱动程序都扮演着重要的角色。应用程序只能通过驱动程序才能同硬件设备或系统内核通讯。Linux内核对不管是Windows还是Linux,驱动程序都扮演着重要的角色。应用程序只能通过驱动程序才能同硬件设备或系统内核通讯。Linux内核对不同的系统定义了标准的接口(API),应用程序就是通过这些标准的接口来操作内核和硬件。驱动可以被编译的内核中(build-in),也可以做为内核模块(Module)存在于内核的外面,需要的时候动态插入到内核中运行。
就像你学习操作系统概念时所了解的那样,Linux内核也分为几个大的部分:进程管理、内存管理、文件系统、设备控制、网络系统等,参考图1-1。
这里就不对Linux系统内核的各个部分做过多的介绍了,在后面的学习中你就会逐渐地对这些概念有个更深入的了解。其实Linux内核的精髓远不止这些,对于一个Linux内核的爱好者或开发者来说,最好详细的浏览内核源代码,订阅Linux内核相关的邮件列表,或是登陆Linux开发社区。更多的信息,请登陆Linux内核官方网站:
一个简单的驱动
下面我们来编写第一个驱动程序,它很简单,在运行时会输出‘Hello World’消息。
// hello.c#include linux/init.h
#include linux/module.h
#include linux/kernel.h
static int __init hello_init(void)
{ printk(KERN_ALERT Hello World!\n); return 0;}static void __exit hello_exit(void)
{ printk(KERN_ALERT Goodbye World!\n);}module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE(GPL);
这就是一个简单的驱动程序,它什么也没做,仅仅是输出一些信息,不过对于我们来说这已经足够了。保存这个程序,命名为hello.c。在写一个Makefile文件用来编译它,Makefile和hello.c文件保存在同一个目录下。
##Makefileifneq ($(KERNELRELEASE),)MODULE_NAME = helloworld$(MODULE_NAME)-objs := hello.oobj-m := $(MODULE_NAME).oelseKERNEL_DIR = /lib/modules/`uname -r`/buildMODULEDIR := $(shell pwd).PHONY: modulesdefault: modulesmodules: make -C $(KERNEL_DIR) M=$(MODULEDIR)
modulesclean distclean: rm -f *.o *.mod.c .*.*.cmd *.ko rm -rf .tmp_versionsendif 编译并运行这个模块:
//需要root权限来运行makeinsmod helloworld.kormmod helloworld.ko
尽管我们对它的一些细节还不够了解,它确实神奇的工作了,这个Hello World信息输出到了屏幕终端上,你可以通过运行dmesg来看到这些信息。
驱动基础 我们通过分析上面的代码来了解一个驱动程序的基本概念。
头文件 就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件,大多的Linux驱动程序需要包含下面三个头文件:
#include linux/init.h#include linux/module.h#include linux/kernel.h
init.h 定义了驱动的初始化和退出相关的函数, kernel.h 定义了经常用到的函数原型及宏定义 module.h 定义了内核模块相关的函数、变量及宏。 初始化 任何一个驱动都去需要提供一个初始化函数,当驱动加载到内核中时,这个初始化函数就会被自动执行,初始化的函数原型定义如下:
typedef int (*initcall_t)(void);
驱动程序是通过module_init宏来声明初始化函数的:
static int __init hello_init(void){ printk(KERN_ALERT Hello World!\n); return 0;}module_init(hello_init);
__ini
文档评论(0)