如何编写 Linux 设备驱动程序 Linux 是 Unix 操作系统的一种变种, 在 Linux
下编写驱动程序的原理和思想完全类似于其他的 Unix 系统,但它 dos 或 window
环境下的驱动程序有很大的区别。 在 Linux 环境下设计驱动程序, 思想简洁, 操
作方便,功能也很强大,但是支持函数少,只能依赖 kernel 中的函数,有些常
用的操作要自己来编写,而且调试也不方便。以下的一些文字主要来源于
khgjohnsonm 的 Write linux device driver , Brennan's Guide to Inline
AssemblyThe Linux A-Z ,还有清华 BBS上的有关 device driver 的一些资料。
一、 Linux device driver 的概念
系统调用是操作系统内核和应用程序之间的接口, 设备驱动程序是操作系统
内核和机器硬件之间的接口。 设备驱动程序为应用程序屏蔽了硬件的细节, 这样
在应用程序看来, 硬件设备只是一个设备文件, 应用程序可以象操作普通文件一
样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能 :
1。对设备初始化和释放。
2。把数据从内核传送到硬件和从硬件读取数据。
3。读取应用程序传送给设备文件的数据和回送应用程序请求的数据。
4。检测和处理设备出现的错误。
在 Linux 操作系统下有三类主要的设备文件类型, 一是字符设备, 二是块设
备,三是网络设备。 字符设备和块设备的主要区别是 : 在对字符设备发出读 / 写请
求时,实际的硬件 I/O 一般就紧接着发生了, 块设备则不然, 它利用一块系统内
存作缓冲区, 当用户进程对设备请求能满足用户的要求, 就返回请求的数据, 如
果不能,就调用请求函数来进行实际的 I/O 操作。块设备是主要针对磁盘等慢速
设备设计的,以免耗费过多的 CPU时间来等待。
已经提到,用户进程是通过设备文件来与实际的硬件打交道。 每个设备文件
都都有其文件属性 (c/b) ,表示是字符设备还是块设备 ?另外每个文件都有两个设
备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个
设备驱动程序的不同的硬件设备, 比如有两个软盘, 就可以用从设备号来区分他
们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,
否则用户进程将无法访问到驱动程序。
最后必须提到的是, 在用户进程调用驱动程序时, 系统进入核心态, 这时不
再是抢先式调度。 也就是说,系统必须在你的驱动程序的子函数返回后才能进行
其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,
然后就是漫长的 fsck 。
读/ 写时,它首先察看缓冲区的内容,如果缓冲区的数据
如何编写 Linux 操作系统下的设备驱动程序
二、实例剖析
我们来写一个最简单的字符设备驱动程序。 虽然它什么也不做, 但是通过它
可以了解 Linux 的设备驱动程序的工作原理。 把下面的 C代码输入机器, 你就会
获得一个真正的设备驱动程序。
#define __NO_VERSION__
#include <linux/modules.h>
#include <linux/version.h>
char kernel_version [] = UTS_RELEASE;
这一段定义了一些版本信息, 虽然用处不是很大, 但也必不可少。 Johnsonm
评论0
最新资源