【原创】嵌入式设备管理大揭秘
1赞开学了,有点忙。今天写写嵌入式设备管理。设备管理的目标有两个:一个是按用户需求提出的要求接入外部设备,系统按一定算法分配和管理控制,而用户不必关心设备的实际地址和控制指令;另外,要尽量提高输入输出设备的利用率,例如发挥主机与外设以及外设与外设之间的真正并行工作能力。主要利用的技术有:中断技术、DMA技术、通道技术、缓冲技术。
CPU与外部设备存储器的连接和数据交换都需要通过接口设备来实现。前者被称为I/O接口,而后者则被称为存储器接口。存储器通常在CPU的同步控制下工作。接口电路比较简单,而I/O设备品种繁多,其相应的接口电路也各不相同。使用设备完成输入/输出的过程,就是主机与外部设备之间数据传送的过程。I/O管理最主要的任务是:完成用户提出的I/O请求、提高I/O速率以及提高设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。
外部设备通常包含4组寄存器:状态寄存器、控制寄存器、数据输入寄存器和数据输出寄存器。这些寄存器都有自己的地址,每个地址叫做一个端口。外部设备这4组寄存器的作用分别为:
1、状态寄存器用来向处理器提供外部设备的工作状态。
2、控制寄存器是来管理外部设备工作模式的。
3、数据输入寄存器和数据输出寄存器都是数据缓存寄存器,即在外设与处理器传递数据时的数据暂存器。
为访问这些外部设备,系统必须为外设的这些寄存器分配地址空间,外设所占用的地址空间叫做I/O空间。
使用设备完成输入/输出的过程,就是主机与外部设备之间数据传送的过程。设备管理的主要任务之一是控制设备与内存或CPU之间的数据传送。
常用的传输控制方式 :
(1)轮询:
(2)中断:
(3)DMA(直接内存存取):
一个完整的DMA过程应包括:初始化、DMA请求、DMA响应、DMA传输、DMA结束5个阶段。
(4)通道:
设备管理包括两个方面的内容:
一是如何在系统中登记注册设备及其驱动程序,以使系统知道设备的存在以及状态;
二是当进程需要使用外部设备时,采用哪种方式将设备及其驱动程序提交给进程。其核心内容就是设备驱动程序的管理。
从进程的角度看,外部设备的驱动程序就是一组包括中断服务程序的操作函数集合。其中,对于外设的中断管理,我们无须操心,因为计算机系统中已经存在一个完善的中断管理系统。所以,重点要关心如何向应用进程提供那些供进程调用的操作函数及管理方法。
字符备(character device)和
普通文件之间的主要区别是:普通
文件可以来回读/写,而大多数字符
设备仅仅是数据通道,只能顺序读/写。
字符设备是Linux最简单的设备,可以像文件一样访问
chrdevs向量表中的每一个条目,一个device_struct数据结构,包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。这块文件操作本身位于这个设备的字符设备驱动程序中,每一个都处理特定的文件操作,比如打开、读、写和关闭。
块设备(block device)是文件系统的物质基础,它也支持像文件一样被访问。
Linux用blkdevs向量表维护已经登记的块设备文件。
字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。
为了屏蔽网络环境中物理网络设备的多样性,Linux对所有的物理设备进行抽象并定义了一个统一的概念,称之为接口(Interface)。所有对网络硬件的访问都是通过接口进行的,接口对上层协议提供一致化的操作集合来处理基本数据的发送和接收,对下层屏蔽硬件差异。
在Linux中所有网络接口都用一个net_device的数据结构表示。通常,网络设备是一个物理设备如以太网卡,但软件也可以作为网络设备,如回环设备(loopback)。所有被网络设备发送和接收的包都用数据结构skb_buff表示,这是一个具有很好的灵活性的数据结构,可以很容易增加或删除网络协议数据包头。
把设备看成文件具有以下几个含义:
(1)每个设备具有一个文件名称,应用程序可以通过设备的文件名来访问具体的设备,同时要受到文件系统访问权限控制机制的保护。
(2)设备在内核中应该对应有一个索引节点。
(3)设备应该可以以文件的方式进行操作。
他们之间的关系为:
相信大家已经明白了设备文件的概念,下一步讲讲如何为这些设备编写驱动文件。