您的位置:首页 > 其它

设备驱动简介

2015-12-25 18:31 323 查看


设备驱动程序:

使某个特定硬件响应一个定义良好的内部变成接口,用户操作通过一组标准化的调用执行,而这些调用是和特定的驱动程序无关的.将这些调用映射到作用于实际硬件的设备的特有操作上,则是设备驱动程序的任务.
control+h显示隐藏文件.
编程问题实际上分为两大部分:
机制(需要提供什么功能),
策略(如何使用这些功能)

(1)TCP/IP网络,位于下层的操作系统负责提供套接字抽象层,但在所传输的数据上则没有附加
任何策略;上面各层的服务器则分别提供不同的服务(以及相关策略)
tpd ,这样的服务器提供文件传输机制,用户可以使用任何自己喜欢的客户端传输文件

(2)驱动程序同样存在机制和策略的分离。例如,软驱驱动程序不带策略,它的作用是将磁盘表示为一个连续的数据块序列,而系统高层负责提供策略,比如谁有权访问软盘驱动器,是直接访问驱动器还是通过文件系统,以及用户是否可以在驱动器上挂装文件系统等等。

(3)编写访问硬件的内核代码时不要给用户强加任何策略。因为不同用户有不同需求,驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用

(4)总的来说,驱动程序设计主要还是综合考虑下面三方面的因素:提供给用户尽量多的选项、驱动程序编写占用较少时间以及尽量保持程序简单而不至于错误丛生。

(5)不带策略的驱动程序包括一些典型的特征:同步和异步操作都支持、驱动程序能够多次打开、能够充分利用硬件特性以及不具备“简化任务”功能或提供与策略相关的软件层等

(6)许多驱动程序是同用户程序一起发行的。这些用户程序主要用来帮助配置和访问目标设备.它们可能是简单的工具,也可能是完整的图形应用程序。例如,用来调整并口打印机驱动程序工作方式的
tunelp程序;作为 PCMCIA驱动程序包一部分的图形化的cardctl工具等等

内核功能划分:
进程管理:
进程管理功能负责创建和撤销进程以及处理它们和外部世界的连接(输入输出)。内核进程管理活动就是在单个或多个
CPU上实现了多个进程的抽象。

内存管理:
内核在有限的可用资源之上为每个进程都创建了一个虚拟地址空间。内核的不同部分在和内存管理子系统交互时使用同一套系统调用.

文件系统:
内核在没有结构的硬件上构造结构化的文件系统,构造的文件系统抽象在整个系统中广泛使用,Linux支持多个文件系统类型,即在物理介质上不同组织数据的方式。例如,磁盘可以格式化为符合
Linux 标准的 ext2文件系统,也可格式化为常用的
FAT文件系统。

设备控制:
除了处理器、内存以及其它很有限的几个对象外,所有设备控制操作都由与被控制设备相关的代码来完成。这段代码就叫做驱动程序,内核必须为系统中的每件外设嵌入相应的驱动程序,包括硬盘驱动器、键盘和磁带条(streamer)等。

网络功能:
网络功能也必须由操作系统来管理,因为大部分网络操作和具体进程无关——数据包的传入是异步事件。在某个进程处理这些数据包之前必须已经被收集、标识和分发。系统负责在应用程序和网络接口之间传递数据包,并根据网络活动控制程序的执行。另外,所有的路由和地址解析问题都有内核处理。

设备和模块分类:
Unix系统将设备分成三种类型:字符设备块设备网络设备。模块可分为字符模块块设备模块网络模块三种

模块:
运行时向内核中添加的代码称之为模块,每个模块由目标代码(没有连接为完整的可执行文件)构成,可以由
insmod 程序动态连接到运行内核,也可以由 rmmod程序解除连接.

insmod
-f
 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k
 将模块设置为自动卸除。
-m  输出模块的载入信息。

-o<模块名称> 指定模块的名称,可使用模块文件的文件名。

-p  测试模块是否能正确地载入kernel。

-s  将所有信息记录在系统记录文件中。

-v  执行时显示详细的信息。

-x  不要汇出模块的外部符号。

-X  汇出模块所有的外部符号,此为预设值。

Linux指令:rmmod——删除不必要的模块
rmmod 即removemodule的简称

功能说明:删除模块。

语法:rmmod [-as][模块名称...]

说明:执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,不需要把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。

参数:

-a  删除所有目前不需要的模块。

-s  把信息输出至syslog常驻服务,而非终端机界面。

字符设备:
字符设备是个能够象字节流(比如文件)一样访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少需要实现
open、 close、 read和
write系统调用。字符终端(/dev/console)和串口(/dev/ttys0以及类似设备)就是两个字符设备,它们能够很好地表示成流抽象索。字符设备可以通过文件系统节点(比如
/dev/tty1和 /dev/lp0等)来访问,它和普通文件之间的唯一差别在于对普通文件的访问可以前后移动访问指针,而大多数字符设备是个只能顺序访问的数据通道。然而,也存在和数据区特性类似的字符设备,访问它们时可前后移动访问指针。

块设备:
和字符设备一样,块设备也是通过
/dev目录下的文件系统节点来访问。块设备(例如磁盘)上能够容纳文件系统。在大多数
Unix 系统中,块设备包含整数个块,而每块包含
1K 或 2的其它次幂字节的数据。Linux可以让应用程序象字符设备一样地读写块设备,允许一次传递任意多字节的数据。因而,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核和驱动程序的接口不同。象字符设备一样,块设备也是通过文件系统节点来访问,它们之间的差异对用户是透明的。块设备除了给内核提供和字符设备一样的接口外,另外还提供了专门面向块设备的接口,不过这些接口对于那些从
/dev 目录下某个目录项打开块设备的用户和应用程序都是不可见的。另外,块设备的接口必须支持挂装文件系统。

网络接口:
任何网络事务都要经过一个网络接口,即一个能够和其它主机交换数据的设备。通常接口是个硬件设备,但也可能是个纯软件设备,比如回环接口。网络接口由内核中的网络子系统驱动,负责发送和接收数据包,它不用了解每项事务如何映射到实际传送的数据包。尽管Telnet和
FTP连接都是面向流的,它们都使用了同一个设备,而这个设备看到的只是数据包,而不是一个个流。
Unix式的访问网络接口的方法是给它们分配一个唯一的名字(比如
eth0),这个名字在文件系统中不存在对应的节点项。内核和网络驱动程序间的通讯完全不同于内核和字符设备以及块设备驱动程序之间的通信,内核调用一套和数据包传输相关的函数而不是
open、write等。

Linux中还存在其它类型的驱动程序模块,这些模块利用内核提供的公共服务来处理特定类型的设备。因此我们能够和通用串行总线(USB)模块、串口模块等通信。最常见的非标准类型的设备是
SCSI 设备 *。

SCSI设备
:
SCSI总线连接的每一款外部设备都在 /dev目录下作为块设备或字符设备出现,就像网卡给网络子系统提供与硬件相关的功能一样,SCSI控制器给
SCSI子系统提供访问实际
接口电缆的能力。SCSI是计算机和外部设备之间的一个通信协议,不管计算机上插入什么类型的控制板,每个
SCSI 设备都响应同样的协议。Linux内核中因此实现了 SCSI模块(即文件操作到
SCSI通信协议之间的映射)。驱动程序开发者必须实现 SCSI抽象和物理数据线之间的映射,这种映射依赖于
SCSI控制器,而与连接到 SCSI数据线上的设备无关。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: