- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
驱动入门知识
设备驱动简介:
内核功能划分:
1、 进程管理
进程管理功能负责创建销毁进程,并处理他们与外界之间的连接(输入输出)。不同进程之间的通信是整个系统的基本功能。
2、 内存管理
内核在有限的可用资源之上为每个进程都创建了一个虚拟的得知空间,内核的不同部分在和内存管理子系统法交互的时候使用一组函数调用,包括简单的malloc/free函数
3、 文件系统
Unix中的每个对象几乎都可以当作文件来看待。内核在没有结构的硬件上构造结构化的文件系统
4、 设备控制
几乎每一个系统操作最终都会映射到物理设备上。除了处理器、内存以及其他很有限的几个对象外,所有设备操作都由相关的代码来完成,这段代码就叫做驱动程序内核必须为系统中的每件外设嵌入相应的驱动程序
5、 网络功能
大部分网络操作和具体的进程无关,数据包的传入是异步事件。在某个进程处理这些数据包之前,必须收集标识和分发这些数据包系统负责在应用程序和网络接口之间传递数据包。
设备和模块的分类:
字符设备:
块设备:
网络接口:
模块:
首先是模块,内核的驱动分为两种形式,一种是直接编译进内核,另一种是写成模块,这样在需要的时候可以装载,不需要的时候就可以接卸,所以要了解驱动首先从模块入手。
在我们学习编程的时候,第一个写的程序基本上都是hello_word。所以,我们现在也写一个hello_word模块。
//Hello_word.c
#includelinux/init.h
#includelinux/kernel.h
#includelinux/module.hstaticinthello_init(void){
printk(KERN_ALERTModuleinit:Helloword!\n);
return0;
}
staticvoidhello_exit(void){
printk(KERN_ALERTModuleexit:bye-bye\n);
return;
}
module_init(hello_init);
module_exit(hello_exit);
对应的用来编译hello_word的makefile文件
//Makefile
obj-m:=hw_module.o
hw_modulemodule-objs:=module
KDIR:=/lib/modules/3.5.0-57-generic/build
MAKE:=make
default:
$(MAKE)-C$(KDIR)SUBDIRS=$(PWD)modulesclean:
$(MAKE)-C$(KDIR)SUBDIRS=$(PWD)clean
这样一个简单的模块就完成了,这里的程序写法、调用与用户空间的程序有很多不同。比如,模块函数没有main函数,在装载模块的时候会调用module_init(hello_init);注册函数,这里注册的是hello_init。在模块卸载时候同样会调用module_exit(hello_exit);注册函数,这里注册的是hello_exit。module_init注册函数主要是初始化,分配内存,注册设备等等,而module_exit中注册函数恰恰相反,主要是释放内存,注销设备等等。
还有在内河中用printk打印信息,不过printk不支持浮点型数据,printk中可以加入7种信息级别
#defineKERN_EMERG0/*systemisunusable*/
#defineKERN_ALERT1/*actionmustbetakenimmediately*/
#defineKERN_CRIT2/*criticalconditions*/
#defineKERN_ERR3/*errorconditions*/
#defineKERN_WARNING4/*warningconditions*/
#defineKERN_NOTICE5/*normalbutsignificant*/
#defineKERN_INFO6/*informational*/
#defineKERN_DEBUG7/*debug-levelmessages*/
对应与不同用户的错误等级选择不同的option,并做不同的处理,小于一定等级的信息答应到终端可以使用dmesg来查看全部的打印信息。
编译内核的头文件是在/lib/modules/$(shelluname-r)/build/include/目录下的,而不是用户目录下/usr/include/,所以编译后不会产生可执行文件
文档评论(0)