- 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 ——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.hstatic 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信息输出到了屏幕终端上(不是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
您可能关注的文档
最近下载
- 一种新型功交换式能量回收装置.pdf VIP
- 生猪屠宰兽医卫生检疫人员考试题库答案.pdf VIP
- 生猪屠宰兽医卫生检疫人员考试题及答案.doc VIP
- 《仲景食品公司应收账款管理现状、问题及对策》6000字.doc VIP
- 2024《仲景食品公司应收账款精益化管理研究》9100字.docx VIP
- 2024《调味配料企业应收账款管理问题及对策—以仲景食品公司为例8600字》.docx VIP
- 2024《企业应收账款管理的现状分析—以仲景食品公司为例》8400字.doc VIP
- 生猪屠宰兽医卫生检验人员理论考试题库及答案.pdf VIP
- 仲景食品有限公司应收账款风险分析与防范.docx VIP
- 仲景食品有限公司应收账款风险分析与防范.docx VIP
文档评论(0)