您的位置:首页 > 运维架构 > Linux

深入浅出linux之设备基本概念

2012-01-12 23:27 183 查看
设备是计算机系统中一个重要概念。CPU,内存和设备是计算机最重要的三个物质基础。

对设备的理解,也是我们理解驱动架构,总线架构的基础。

通常的显卡网卡声卡等设备,都是先插入计算机系统的PCI总线插槽(早期还有ISA,MCA总线等。现在PC领域基本PCI总线统一了),然后安装驱动,之后应用程序可以通过文件系统打开和读写设备文件。这个过程可以从三个层面理解:设备本身的特性,总线和操作系统对设备的处理,驱动层次。

以PCI设备为例,一个PCI设备,本身就包含一个配置表。配置表包含设备制造商填充的厂商信息,设备属性等等的通用配置信息。此外,设备厂商还应该提供设备的控制寄存器信息,通过这些控制寄存器,系统可以设置设备的状态,控制设备的运行,或者从设备获得状态信息。另外设备还可能配备了内存(也有的设备可能没有),系统可以读写设备的内存。用一个例子来解释设备的基本信息:



如上图,设备本身有一些配置信息。配置信息里面的设备内存基址,指示了设备内存的地址和长度,而设备寄存器基址,则指向了设备的寄存器地址和长度。该设备有两个寄存器,一个输入寄存器,一个输出寄存器。当输入寄存器写入数值后,可以从输出寄存器读到另一个数值。

设备寄存器基址,这个概念有点难理解。实际上,可以看做是一个地址,对这个地址写指令,就可以控制设备。所以,设备寄存器其实就是设备的控制接口。这个接口必须要映射到计算机系统的io空间,这样内核就可以访问设备了。

一 总线和操作系统的io架构

不同的处理器对io访问有不同的处理方式。对X86系统来说,专门提供了特别的指令来访问设备寄存器。所有这些设备寄存器占据了65536个8位的空间。这个空间称为计算机的IO端口空间。

对上文的例子设备来说,需要把设备的寄存器基址纳入到系统的IO端口空间里面,然后驱动就可以通过系统提供的特别指令来访问设备的寄存器。假设设备厂商提供的寄存器基址是0x1c00,长度是8个字节。那么有两种情况,一种是这个0x1c00地址和别的设备没有冲突,可以直接使用,那么操作系统内核就记录设备的寄存器基址为0x1c00,驱动通过X86系统提供的io指令访问0x1c00 io地址,或者叫0x1c00 io端口,就可以设置设备输入寄存器的内容。访问地址0x1c04,就可以读到设备输出寄存器的内容。

另外一种情况是其它设备也使用了0x1c00这个io地址。那么操作系统内核就需要寻找一个合适的寄存器基址,然后更新设备的寄存器基址,并记录到内核的设备信息里面。驱动使用x86的io指令,访问这个更新的地址,就可以设置设备输入寄存器的内容了。

通过设备的io端口访问设备寄存器来控制设备,这就是设备驱动的功能。设备厂商会提供设备寄存器的详细内容,这也是驱动开发者所必须关注的。而发现设备,扫描设备信息,为设备提供合适的io地址空间,这是内核的总线部分要处理的事情。后文将继续分析。

设备的内存处理过程差不多一样。内核同样要读取设备内存基址,然后找到合适的内存空间,把设备的内存映射到内存空间。然后驱动就可以访问设备的内存了。

二 io配置信息

设备的配置信息提供了设备寄存器基址和设备内存基址。因此首先要读到这两个寄存器的内容,也就是设备寄存器基址和长度以及设备内存基址和长度,然后操作系统才能安排合适的io端口和io内存。

但是如何去读设备的配置信息?X86系统使用的PCI总线对这个问题的解决方法是:保留了8个字节的io端口地址,就是0xCF8~0xCFF。要访问设备的某个配置信息,先往0xCF8地址写入目标地址信息,然后通过0xCFC地址读数据,就可以获得这个配置信息。这里的写和读,都使用的是x86所特有的io指令。

写入0xCF8的目标地址信息,是一种包括了总线号,设备号,功能号和配置寄存器地址的综合信息,这部分和PCI有很深的关系了,在PCI总线一节将继续分析。

三 DMA

主机的CPU能访问设备的内存,那么设备能否访问系统的内存?这个就是DMA的概念。设备本身是挂载在总线上,那么设备使用的内存地址,就是总线能访问的地址。称为总线地址。在X86系统中,总线地址和内存物理地址相同,设备直接使用物理地址访问内存。但两者概念实际上是不同的。

如何把DMA地址传送给设备?从设备的模型可以看出来,设备的寄存器里面有一个是保存DMA地址的,驱动设置这个寄存器的内容,然后设备就能根据该地址启动DMA,访问主机的内存。

四 中断

设备是控制输入输出的。当接收到输入信息后,如何通知主机CPU?通常情况下是通过中断(CPU也可以轮询来检查设备),中断既和内核的总线部分有关,又和中断部分有关。在后续章节将继续分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: