首页 > 代码库 > linux设备驱动(一)

linux设备驱动(一)

linux设备驱动

一,设备驱动的作用

  对设备驱动最通俗的解释是“驱动硬件设备行动”。驱动和底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询(轮询(Polling)是一种CPU决策如何提供周边设备服务的方式,又称“程控输出入”(Programmed I/O)。轮询法的概念是,由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始),中断处理,DMA通信,进行物理内存向虚拟的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。

  由此可见,设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统软件的应用编程接口(API)就可以让硬件去完成要求的工作。

  设备驱动可分为无操作系统的设备驱动和有操作系统的设备驱动。

  1,无操作系统的设备驱动

   并不是任何一个计算机系统都一定要运行操作系统,在许多情况下,操作系统都不必存在。对于功能比较单一,控制并不复杂的系统,譬如ASIC内部,公交车的刷卡机等,并不需要多任务调度,文件系统,内存管理等复杂功能,用单任务架构完全可以良好地支持他们的工作。一个无限循环中夹杂对设备中断的检测或者对设备的轮询是这系统中软件的典型架构,如下代码:

单任务软件典型架构

int main(int argc,char* avgv[])
{
  while(1)
    {
        if(serialInt==1)
       // 有串口中断
      {
        ProcessSerialInt();//处理串口中断
        serialInt=0;//中断标志变量清0 
     }
    if(keyInt==1)
     //有按键中断
    {
      ProcessKeyInt();//处理按键中断
      keyInt=0;//中断标志标量清0
    }
     status=CheckXXX();
    switch(status)
    {
       . . .
     }
      . . .
     }  
}    

2,有操作系统时的设备驱动

  当系统中包含操作系统后,设备驱动会变得怎样?

  首先,无操作系统是设备驱动的硬件操作工作仍然是必不可少的,没有这部分,驱动不可能与硬件打交道。

  其次,我们还需要将驱动融入内核。为了实现这种融合,必须在所有设备的驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定的,对一类设备而言结构一致,独立于具体的设备。。

  由此可见,当系统中存在操作系统时,驱动变成了连接硬件和内核的桥梁。操作系统的存在势必要求设备驱动附加更多代码和功能,吧单一的“驱使硬件设备行动”变成了操作系统内与硬件交互的模块,他对外呈现为操作系统的API,不再给应用软件工程师直接提供接口。

  那我们要问,有了操作系统之后,驱动反而变得复杂,那么操作系统干什么?

  首先,一个复杂的软件系统需要处理多个并发的任务,没有操作系统,想完成多任务并发是很困难的。

  其次,操作系统给我们提供内存管理机制。一个典型的例子是,对于多数含MMU的处理器而言,windows,linux等操作系统可以让每个进程都可以独立的访问4G的内存空间。

  简而言之,操作系统通过给驱动制作麻烦来达到给上层应用提供便利的目的。当驱动都按照操作系统给出的独立于设备的接口而设计,那么,应用程序将可使用统一的系统调用接口来访问各种设备。

  作为linux爱好者,欢迎各位相互交流。

 

linux设备驱动(一)