Linux内核源码有一半是由驱动组成,驱动在Linux完成其强大功能中扮演重要角色,而在开发自己的系统时,有时会发现无法在现有代码中找到支持特定的硬件的驱动,这是就需要自己动手写一些小程序来完成。
I/O设备
I/O设备一般包括两部分:设备控制器和设备本身。控制器是插在电路板上的一块芯片或一组芯片,这块电路板物理的控制设备。它从操作系统接收命令,例如,从设备读数据并且完成数据的处理。例如磁盘控制器。
I/O驱动
每类设备控制器都是不同的,所以,需要不同的软件进行控制。专门与控制器对话,发出命令并接收响应的软件,称为设备驱动程序。每个控制器厂家必须为所支持的操作系统提供相应的设备驱动程序。例如,一台扫描仪会配有用于windows2000,windowsXP,Vista以及Linux的设备驱动程序。
为了能够使用设备驱动程序,必须把设备驱动程序装入到操作系统中,这样它可以在内核态中运行。有三个途径:
- 将驱动程序与内核重新链接,然后重启操作系统
- 在一个操作系统文件中设置一个入口,并通知该文件需要一个设备驱动程序,然后重启系统,在系统启动时,操作系统去寻找所需的设备驱动程序并装载之windows就是这样
- 操作系统能够运行在接收新的设备驱动程序并立即将其安装好,无需重启操作系统。热插拔设备,都需要动态可装载设备驱动程序。
每个设备控制器都有少量的用于通信的寄存器,所有设备寄存器的集合构成了I/O端口空间。
在有些计算机中,设备寄存器被映射到操作系统的地址空间,这样,它们就可以像普通存储字一样读取和写入。在这样的计算机中,不需要专门的I/O指令,用户程序可以被硬件阻挡在外
在另一些计算机中,设备寄存器被放入一个专门的I/O端口空间中,每个寄存器都有一个端口地址。在这些机器中,提供在内核态中可使用的专门的in和out指令,供设备驱动程序读写这些寄存器用。不占用地址空间。
I/O设备的中断调用
- 设备驱动程序通过写设备寄存器通知设备控制器做什么,然后,设备控制器启动该设备。当设备控制器传送完毕被告知的要进行读写的字节数量后
- 使用特定的总线发信号给中断控制器芯片。如果中断控制器已经准备好中断,他会在CPU芯片的一个管脚上声明,这就是第三步
- 第四步中,中断控制器把该设备的编号放在总线上,这样CPU可以读总线,并且知道哪个设备刚刚完成了操作
- 一旦CPU决定取中断,通常程序计数器和PSW就被压入当前堆栈中,并且CPU被切换到用户态。设备编号可以成为部分内存的一个引用,用于寻找该设备中断处理程序的地址。这部分称为中断向量。
- 中断处理程序开始后,它取走已入栈的程序计数器和PSW,并保存,然后查询设备的状态。全部完成之后,它返回到先前运行的用户程序尚未执行的指令
Linux设备的分类:
- 字符设备:字符设备是以字符为单位输入输出数据的设备,一般不需要使用缓冲区而直接对它进行读写。如打印机,显示终端
- 块设备:是以一定大小的数据块为单位输入输出数据的,一般要使用缓冲区在设备与内存之间传送数据。如磁盘,光盘等。
- 网络设备:网络设备是通过网络传输数据的设备,一般指与通信网络连接的网络适配器(网卡)等。如以太网卡,Linux使用套接口(socket)以文件I/O方式提供了对网络数据的访问。
设备驱动程序的作用:
- 对设备进行初始化
- 启动或停止设备的运行
- 把设备上的数据传送到内存
- 把数据从内存传送到设备
- 检测设备状态
其具有以下特点:
- 驱动程序是与设备相关的
- 驱动程序的代码由内核统一管理
- 驱动程序在具有特级权的内核态下运行
- 设备驱动程序是输入输出子系统的一部分
- 驱动程序是为某个进程服务的,其执行过程仍处在进程运行的过程中,即处于进程上下文中。
- 若驱动程序需要等待设备的某种状态,它将阻塞当前进程,把进程加入到该种设备的等待队列中。
识别设备:
对设备的识别使用设备类型,主设备号,次设备号。
- 串口设备是cu
- 并口设备是lp
- IDE普通硬盘是hd:PATA并口硬盘基本上已经淘汰。SATA串口硬盘接口是7脚的。
- SCIS硬盘是sd:用作服务器的应用。
- 软盘是fp
对应设备操作分为三类:
7. open():启动
8. close():停止
9. read():读取数据
10. write():输出数据
设备的控制方式:
- 查询等待方式
- 中断方式
- DMA方式