开发者社区> hyman> 正文

《LINUX设备驱动程序》学习札记(一)

简介:
+关注继续查看

总结章节:第一章 设备驱动程序简介

          第二章 构造和运行模块

提到驱动程序就不得不先说下两个名词:内核空间和用户空间。用户空间即用户应用所运行的空间,内核空间值得是操作系统内核运行的空间。用户空间不能直接引用或者操作内核空间的数据,内核空间也不能直接引用用户空间的数据。操作系统内核对整个系统资源进行管理,这些资源中也包括硬件资源。所以用户空间也不能直接访问硬件资源。驱动为用户访问特定的硬件资源提供接口。用户空间要访问硬件资源则只需要调用驱动所提供的接口。驱动完全屏蔽了内部操作。从而,用户空间通过驱动这层特殊的内核间接的访问硬件资源。

驱动的作用在于提供机制,机制即:需要提供什么功能,而不是提供策略,策略即:如何使用这些功能。提供机制是驱动程序的任务,而策略则是应用程序所要完成的任务。由于不同的环境会有不同的方式来访问硬件,作为驱动程序的编写者,应该尽量做到使驱动不到策略,在编写驱动的时候,程序员还应该特别注意,编写访问硬件的内核代码,不要给用户强加任何特定策略。因为不同的用户会有不同的需求。

内核的功能分为:进程管理,内存管理,文件系统,设备控制,网络功能。所有设备控制操作都由与被控制设备相关代码来完成,这段代码就叫驱动程序,充分说明驱动程序是内核的一部分。

既然驱动程序是内核的一部分,那么驱动程序的编写就需要用到内核的头文件,对于Linux 2.6版本的内核驱动程序还需要依赖内核源码树。所以在编写驱动之前,要弄清楚,自己编写的驱动实际就是在编写内核,那么程序中所有用到的头文件都是内核的。

内核源码树的路径可以用一下命令查看:

# cd /lib/modules/$(uname -r)/build/ # pwd

现在编写一个简单的 HelloWorld 程序来说明

#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE(“Dual MPL/GPL”); static int hello_init(void) { printk(KERN_ALERT “Hello, world/n”); return 0; } static void hello_exit(void) { printk(KERN_ALERT “Goodbye cruel world/n”); } module_init(hello_init); module_exit(hello_exit);

下面是 Makefile 文件内容

obj-m = hello.o KERNELDIR ?= /lib/modules/$(uname -r)/build


Makefile 代码解释:

obj-m 是内核要求的。驱动最终 hello.ko 依赖于 hello.o 文件

下面的一句就是制定内核树。如果驱动目标平台不是当前平台,只需要更改 KERNELDIR 的路径就可以了。

另外需要提的是驱动一旦在内核中注册了,那么其他的程序就可以使用该设备了,所以,千万不要再驱动内部初始化完成之前就在内核中注册该驱动。当驱动程序出错了,我们应该向内核注销该驱动程序。

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/02/07/5297188.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux设备驱动程序学习----1.设备驱动程序简介
Linux设备驱动程序学习----1.设备驱动程序简介设备驱动程序简介更多内容请参考Linux设备驱动程序学习----目录 简介  Linux系统的优点是,系统内部实现细节对所有人都是公开的。Linux内核由大量复杂的代码组成,设备驱动程序可以作为进入Linux内核世界大门的切入口。
1067 0
《精通Linux设备驱动程序开发》——导读
在Linux内核源代码树提供的各个子系统中,drivers/目录是其中最大的一个分支,它比其他子系统大数倍。随着各种新技术的广泛应用,内核中新的设备驱动程序的开发工作正在稳步加速。最新的Linux内核支持多达70余种设备驱动程序。
1453 0
《精通Linux设备驱动程序开发》——1.8 可加载的模块
内核模块减小了内核的大小,并缩短了开发——编译——测试的周期。为了让一次修改生效,你仅仅需要重新编译特定的模块并重新加载它。在第21章中,我们将学习模块调试技术。
1303 0
《精通Linux设备驱动程序开发》——1.7 编译内核
menuconfig是内核配置菜单的文本界面,使用make xconfig可以产生一个图形界面。所选择的配置信息被存放在内核源码树根目录的.config文件中。如果不想从头开始进行配置,可以使用 arch/your-arch/defconfig作为起点或者若你的体系架构支持多个平台,也可以用)arch/your-arch/ configs/your-machine_defconfig文件作为起点。
1412 0
《精通Linux设备驱动程序开发》——1.6 查看源代码
drivers。这个目录包含了大量设备类和外设控制器的驱动,包括字符、串口、内置集成电路(I)、个人计算机存储卡国际联盟(PCMCIA)、外围组件互连(PCI)、通用串行总线(USB)、视频、音频、块、集成驱动电子设备(IDE)、小型计算机系统接口(SCSI)、CD-ROM、网络适配器、异步传输模式(ATM)、蓝牙和内存技术设备(MTD)等。
2347 0
《精通Linux设备驱动程序开发》——1.5 Linux发行版
一个GNU/Linux系统除了内核以外,还包括大量的实用程序、程序、库和工具,因此,获得和正确安装所有的组件是一项艰巨的任务。而Linux发行版有序地将这些组件进行了分类,并捆绑成相应的包,从而分担了这一艰巨任务。一个常见的发行版包含数以千计的捆绑好的包。
1518 0
+关注
hyman
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
Decian GNU/Linux安全合规之路
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
冬季实战营第二期:Linux操作系统实战入门
立即下载