Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303522
  • 博文数量: 69
  • 博客积分: 3093
  • 博客等级: 中校
  • 技术积分: 626
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-17 13:48
文章分类

全部博文(69)

文章存档

2011年(27)

2010年(11)

2009年(31)

分类: LINUX

2009-08-20 18:00:17

驱动程序的编写强调设备驱动程序的作用在与提供机制,而不是提供策略.(policy)
机制:机器的构造和工作原理(驱动程序应该处理如何使硬件可用)
策略:根据形势发展而制定的行动方针和斗争方法 (怎样使用硬件)
unix中图形显示器的管理就分为X服务器以及窗口和会话管理器两部分,前者操作硬件,给用户程序提供统一的接口,后者实现特定的策略,不用知道任何与硬件相关的知识。

编写驱动程序时应该特别注意:编写访问硬件的内核代码时不要 给用户强加任何策略,因为不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用,因此,当驱动程序只提供了访问硬件的功能而没有附加任何限制时,这个驱动程序就比较灵活,然而,有时候我们也需要在驱动程序中使用一些策略,例如:某个数字I/O驱动程序只提供了以字节为单位访问硬件的方法,这样就省去了编写额外代码以处理单个数据位的麻烦。
驱动程序设计主要考虑三方面:
    1. 提供给用户尽量多的选项
    2. 编写驱动程序占用较少的时间
    3. 尽量保持程序简单而不至于错误丛生
不带策略的驱动程序包括一些典型的特性:
    1. 支持同步和异步操作
    2. 驱动程序能够被多次打开
    3. 能够充分利用硬件的特性以及不具备”简化任务“功能或提供与策略相关的操作的软件层等
    这种类型的驱动程序不仅能很好的服务于最终用户,而且也易于编写和维护

内核功能划分:
    1. 进程管理:负责创建和撤销进程以及处理它们和外部世界的连接,概括说内核的进程管理活动就是在单个或多个CPU上实现多个进程的抽象
    2. 内存管理: 内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素,内核在有限的可用资源上为每个进程都创建 了一个虚拟的寻址空间。内核的不同部分在内存管理子系统交互时使用一套相同的系统调用,包括从简单的malloc/free对到其他一些不常用的系统调用
    3. 文件系统:UNIX在很大程度上依赖文件系统的概念,UNIX中的每个对象几乎都可以被看做文件,内核在没有结构的硬件上构造结构化的文件系统,所构造的文件系统抽象在整个系统中广泛使用。
    4. 设备控制:几乎每个系统操作最终都会映射到屋里设备上,除了处理器,内存以及其他很有限的几个实体之外,所有设备控制操作都由与被控制设备相关的代码来完成,这段代码就叫设备驱动程序
    5. 网络功能:网络功能也必须由操作系统来管理,因为大部分网络操作都和具体进程无关--数据包的传入是异步事件,在某个进程处理这些数据包之前,数据包必须已经被收集,标识和分发,系统负责在应用程序和网络接口之间传递数据包,并根据网络活动控制程序的执行,另外,所有的路由和地址解析问题都由内核处理。
设备和模块分类:
    1. 字符设备:(character device)能够像字节流一样被访问的设备,由字符设备驱动程序来实现这种特性,字符设备驱动程序至少需要实现open,close,read,write系统调用,字符终端(/dev/console)和串口(/dev/ttySO以及类似设备)就是字符设备的两个例子,他们能够用流抽象很好的表示,字符设备可以通过文件系统节点(/dev/tty1和/dev/lp0等)来访问,它和普通文件之间的唯一差别在于对普通文件的访问可以前后移动访问指针,而大多数字符设备是只能顺序访问的数据通道,然而,也存在和数据区特性类似的字符设备,访问它们时可以前后移动指针。例如,帧捕捉卡就是这样一个设备,应用程序可以用mmap或lseek访问所抓取的整个图像。
    2. 块设备:(block device)和字符设备一样,块设备也是通过/dev目录下的文件系统节点被访问的,块设备(例如磁盘)上能够容纳文件系统。在大多数unix系统中,块设备包含数个块,而每块包含1kb或2的几次幂字节的数据。linux允许应用程序像字符设备那样读写块设备,可以一次传递任意多字节的数据。因而,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核与驱动程序的接口不同,像字符设备一样,块设备也是通过文件系统节点被访问的,它们之间的差异对用户来说是透明的,块驱动程序除了给内核提供和字符驱动程序一样的接口以外,还提供了专门面向块设备的接口,不过这些接口对于那些从/dev目录下某个目录项打开块设备的用户和应用程序都是不可见的。另外,块设备的接口必须支持挂载(mount)文件系统。
    3. 网络接口:(network interface)任何网络事务都要经过一个网络接口,即一个能够和其他主机交换数据的设备,通常接口是个硬件设备,但也可能是个纯软件设备,比如回环接口。网络接口由内核中的网络子系统驱动,负责发送和接收数据包,它无须了解每项事务是如何映射到实际传送的数据包的。尽管telnet和ftp连接都是面向流的,它们都使用了同一个设备,但这个设备看到的只是数据包,而不是独立的流,由于不是面向流的设备,因此网络接口映射到文件系统中的节点(比如/dev/tty1)比较困难。UNIX式的访问网络接口的方法是给它们分配一个唯一的名字(比如eth0),但这个名字在文件系统中不存在对应的节点项。内核和网络驱动程序间的通信完全不同于内核和字符设备以及块设备驱动程序之间的通信,内核调用一套和数据包传输相关的函数,而不是read,write等。

阅读(887) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~