《LINUX设备驱动程序》学习札记(一)
来源:互联网 发布:程序员要求 编辑:程序博客网 时间:2024/09/21 09:21
第二章 构造和运行模块
提到驱动程序就不得不先说下两个名词:内核空间和用户空间。用户空间即用户应用所运行的空间,内核空间值得是操作系统内核运行的空间。用户空间不能直接引用或者操作内核空间的数据,内核空间也不能直接引用用户空间的数据。操作系统内核对整个系统资源进行管理,这些资源中也包括硬件资源。所以用户空间也不能直接访问硬件资源。驱动为用户访问特定的硬件资源提供接口。用户空间要访问硬件资源则只需要调用驱动所提供的接口。驱动完全屏蔽了内部操作。从而,用户空间通过驱动这层特殊的内核间接的访问硬件资源。
驱动的作用在于提供机制,机制即:需要提供什么功能,而不是提供策略,策略即:如何使用这些功能。提供机制是驱动程序的任务,而策略则是应用程序所要完成的任务。由于不同的环境会有不同的方式来访问硬件,作为驱动程序的编写者,应该尽量做到使驱动不到策略,在编写驱动的时候,程序员还应该特别注意,编写访问硬件的内核代码,不要给用户强加任何特定策略。因为不同的用户会有不同的需求。
内核的功能分为:进程管理,内存管理,文件系统,设备控制,网络功能。所有设备控制操作都由与被控制设备相关代码来完成,这段代码就叫驱动程序,充分说明驱动程序是内核的一部分。
既然驱动程序是内核的一部分,那么驱动程序的编写就需要用到内核的头文件,对于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.chinaunix.net/u3/109761/showart_216743- 《LINUX设备驱动程序》学习札记(一)
- Linux设备驱动程序的学习 (一)
- linux设备驱动程序学习笔记(一)
- Linux设备驱动程序学习-USB 驱动程序(一)
- Linux设备驱动程序学习-USB 驱动程序(一)
- 《Linux设备驱动程序》读书笔记:字符设备驱动程序(一)
- LINUX设备驱动程序笔记(一)设备驱动程序简介
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(1)-字符设备驱动程序
- Linux设备驱动程序学习(3)-字符设备驱动程序
- Linux设备驱动程序学习(1) -字符设备驱动程序
- Linux设备驱动程序学习(16)-USB 驱动程序(一)
- Linux设备驱动程序学习之设备模型一
- Linux设备驱动程序学习
- Linux设备驱动程序学习
- extjs中用户自动拖放以改变某一个区域的大小属性
- 史蒂夫·乔布斯在斯坦福大学的演讲——Jobs离职了
- DDoS攻击实施的六大方法
- 程序出错的处理
- 区分显示LCD汉字字模库中的中文与英文
- 《LINUX设备驱动程序》学习札记(一)
- MapReduce源码分析总结
- mtime vs ctime vs atime
- 对AS3.0事件机制的理解
- java序列化方式性能比较
- curses.h学习笔记
- [WP7]实现Listbox中长按弹出ContextMenu效果
- Ebay架构特点(HPTS 2009)
- eclipse J2me环境搭建