收藏 分享(赏)

Linux系统的硬件驱动程序编写原理.doc

上传人:dcjskn 文档编号:8513870 上传时间:2019-06-30 格式:DOC 页数:10 大小:175.50KB
下载 相关 举报
Linux系统的硬件驱动程序编写原理.doc_第1页
第1页 / 共10页
Linux系统的硬件驱动程序编写原理.doc_第2页
第2页 / 共10页
Linux系统的硬件驱动程序编写原理.doc_第3页
第3页 / 共10页
Linux系统的硬件驱动程序编写原理.doc_第4页
第4页 / 共10页
Linux系统的硬件驱动程序编写原理.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、Linux 系统的硬件驱动程序编写原理 *本文详细地介绍如何 Linux 系统的硬件驱动程序的编写原理,指出哪些内核例程将会被调用、如何初始化驱动程序及如何分配内存等等。大家一定对 Linux 操作系统有所了解了,在此本人也不再赘述了。好吧,下面简单地介绍一下设备驱动程序。顾名思义,驱动程序是用来控制计算机外围设备的,Linux 系统将所有的外围设备都高度地抽象成一些字节的序列,并且以文件的形式来表示这些设备。我们可以来看一下 Linux 的 I/O 子系统(图 1)。图 1 Linux 的 I/O 子系统从图上我们可以看出,内核紧紧地包围在硬件周围,内核是一些软件包的组合,它们可以直接访问系

2、统的硬件,包括处理器、内存和 I/O 设备。而用户进程则通过内核提供的用户服务来和内核通讯,从而间接地控制系统硬件。我们可以通过图 2 来了解这些动作的具体情况。图 2 用户级、内核级和硬件级三者之间的通讯图上显示了用户级的程序使用内核提供的标准系统调用来与内核通讯,这些系统调用有:open(), read(), write(), ioctl(), close() 等等。Linux 的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。图 3 Linux 的 I/O 子系统Linux

3、 内核使用 “设备无关 “的 I/O 子系统来为所有的设备服务。每个设备都提供标准接口给内核,从而尽可能地隐藏了自己的特性。图 3 展示了用户程序使用一些基本的系统调用从设备读取数据并且将它们存入缓冲的例子。我们可以看到,每当一个系统调用被使用时,内核就转到相应的设备驱动例程来操纵硬件。每个设备在 Linux 系统上看起来都像一个文件,它们存放在/dev 目录中并被称为“特殊文件“或是 “设备节点 “。大家可以使用 ls -l /dev/lp* 来得到以下的输出: crw-rw-rw 1 root root 6, 0 April 23 1994 /dev/lp0 这行输出表示 lp0 是一个字

4、符设备(属性字段的第一个字符是c),主设备号是 6,次设备号是 0。主设备号用来向内核表明这一设备节点所代表的驱动程序的类型(比如:主设备号是 3 的块设备是 IDE 磁盘驱动程序,而主设备号为 8 的块设备是 SCSI 磁盘驱动程序);每个驱动程序负责管理它所驱动的几个硬件实例,这些硬件实例则由次设备号来表示(例如:次设备号为 0 的 SCSI 磁盘代表整个也可以说是“ 第一个“SCSI 磁盘,而次设备号为 1 到 15 的磁盘代表此 SCSI 磁盘上的 15 个分区)。到此大家应该对 Linux 的设备有所了解了吧,下面就可以开始我们的正题“ 设备驱动程序“。设备驱动程序是一组由内核中的相

5、关子例程和数据组成的 I/O 设备软件接口。每当内核意识到要对某个设备进行特殊的操作时,它就调用相应的驱动例程。这就使得控制从用户进程转移到了驱动例程,当驱动例程完成后,控制又被返回至用户进程。图 5 就显示了以上的过程。图 5 设备驱动程序的作用每个设备驱动程序都具有以下几个特性:l 具有一整套的和硬件设备通讯的例程,并且提供给操作系统一套标准的软件接口;l 具有一个可以被操作系统动态地调用和移除的自包含组件;l 可以控制和管理用户程序和物理设备之间的数据流。接下来我们来了解一下字符设备和块设备,它们是 Linux 系统中两种主要的外围设备。我们常见的磁盘是块设备,而终端和打印机是字符设备。

6、块设备被用户程序通过系统缓冲来访问。特别是系统内存分配和管理进程就没有必要来充当从外设读写的数据传输者了。正好与之相反的是,字符设备直接与用户程序进行通讯,而且两者似乎没有缓冲区。Linux的传输控制机制会根据用户程序的需要来正确地操纵内存和磁盘等外设来取得数据。在Linux 系统中字符设备驱动器被保存为/usr/src/linux/drivers/char 目录中。下面我们重点介绍字符设备驱动程序的开发方法。首先了解一下 Linux 的内核编程环境。我们知道每个 Linux 用户进程都在一个独立的系统空间中运行着,与系统区和其他用户进程相隔离。这样就保护了一个用户进程的运行环境,以免被其他用

7、户进程所破坏。与这种情况正相反的是,设备驱动程序运行在内核模式,它们具有很大的自由度。这些设备驱动程序都是被假设为正确和可靠的,它们是内核的一部分,可以处理系统中断请求和访问外围设备,同时它们有效地处理中断请求以便系统调度程序保持系统需求的平衡。所以设备驱动程序可以脱离系统的限制来使用系统区,比如系统的缓冲区等等。一个设备驱动程序同时包括中断和同步区域。其中中断区域处理实时事件并且被设备的中断所驱动;而同步区域则组成了设备的剩余部分,处理进程的同步事件。所以,当一个设备需要一些软件服务时,就发出一个“中断“ ,然后中断处理器得到产生中断的原因同时进行相应的动作。一个 Linux 进程可能会在事件发生之前一直等待下去。例如,一个进程可能会在运行中等待一些写入硬件设备的信息的到来。其中一种方式是进程可以使用 sleep()和 wakeup()这两个系统调用,进程先使自己处于睡眠状态,等待事件的到来,一旦事件发生,进程即可被唤醒。举个例子来说:interruptible_sleep_on( 加到/usr/src/linux/driver/char/mem.c 文件的 chr_drv_init()函数末。接下来的工作就是将驱动设备安装到内核中去了(注意:字符设备驱动程序只能被安装在/usr/src/linux/drivers/char/char.a 库文件中)。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报