Linux ——Driver.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux ——Driver

第一章 驱动程序基本框架 星期二, 06/08/2010 - 00:21 — william 前言 不管是Windows还是Linux,驱动程序都扮演着重要的角色。应用程序只能通过驱动程序才能同硬件设备或系统内核通讯。Linux内核对不同的系统 定义了标准的接口(API),应用程序就是通过这些标准的接口来操作内核和硬件。驱动可以被编译的内核中(build-in),也可以做为内核模块 (Module)存在于内核的外面,需要的时候动态插入到内核中运行。 就像你学习操作系统概念时所了解的那样,Linux内核也分为几个大的部分:进程管理、内存管理、文件系统、设备控制、网络系统等,参考图1-1。 图1-1 Linux系统(来源:O’Reilly Media, LDD3) 这里就不对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文件保存在同一个目录下。 ##Makefile ifneq ($(KERNELRELEASE),) MODULE_NAME = helloworld $(MODULE_NAME)-objs := hello.o obj-m?? := $(MODULE_NAME).o else KERNEL_DIR = /lib/modules/`uname -r`/build MODULEDIR := $(shell pwd) .PHONY: modules default: modules modules: ??????? make -C $(KERNEL_DIR)? M=$(MODULEDIR) modules clean distclean: ??????? rm -f *.o *.mod.c .*.*.cmd *.ko ??????? rm -rf .tmp_versions endif 编译并运行这个模块: //需要root权限来运行 make insmod helloworld.ko rmmod helloworld.ko 尽管我们对它的一些细节还不够了解,它确实神奇的工作了,这个Hello World信息输出到了屏幕终端上(不是VT),或者系统的Kenrel log里(/var/log/messages),你可以通过运行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_A

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档