对驱动开发和移植的一个理解设备的添加和驱动程序的添加:在移植一个设备驱动时,或者说开发时,一是需要在内核配置文件中加入该设备驱动,例如我们需要在makemenuconfig中加入加入对某个驱动的编译,同时又需要去实现具体对这个设备操作的代码。在代码中我们又会发现有添加设备和添加设备驱动程序(或者都叫做注册)的概念。设备和设备驱动程序在内和眼里并不是生来就联系在一起的,应该是内核根据驱动程序中的设备名称等信息对设备进行枚举,而后对应起来的。内核眼中的设备:内核系统当然不知设备是什么,怎么操作,她只知道设备号,按照设备号来管理。但他肯定是有一个规则的,每个设备驱动加进来的时候都要按照这个规则。例如每个驱动设备被认为一个文件,按照文件来打开,读写。内核有一个规则:open,read,write等,具体的驱动实现时,就去实现open,read等对应的函数。这样,内核在调用该设备的驱动时,直接调用它所熟悉的open,read等,里边干了什么,他并不关心,也无法得知。驱动开发中的共性与特性:驱动开发涉及到linux内核本身独立于硬件的部分,同时也涉及到与具体硬件平台相关的部分.内核的设计模式中使得在独立于硬件那部分(处于内核本身那部分)向外开发了统一的面向多样化硬件的接口。例如我们在开发一个硬件的驱动时,总是先去考虑有没有类似的驱动在linux内核中已经开发了,如果有,我们要做的就是移植。所谓内核中已经支持的驱动就是说在独立于硬件设备这部分在内核中已经有了,与硬件相关那部分,需要进行修改。那么这两部分都会在内核目录的那些位置呢?了解了他们的位置,更有助于驱动程序层次结构的理解。独立于硬件的驱动程序的上层部分会放在/driver目录下,驱动的.c文件中包含添加驱动的过程,可以从init初始化开始,进行跟踪。当需要涉及到硬件的部分时,就会出现一个接口。那么这个接口就需要硬件那部分实现了。硬件那部分在哪呢?内核目录中的arch下放置了各个体系结构或平台下的硬件功能的源文件。在include下经过各种巧妙的软连接使程序包含到合适的体系结构下合适的开发平台下的头文件。只要独立于硬件的头文件都会放在/include/linux目录下。内核部分把共性提出来例如内核部分说:到秦皇岛钓鱼这是两个动作,很明确的描述了整个过程。到秦皇岛具体怎么到,可以乘火车,可以开车,可以步行。那么硬件部分(某种体系结构下的某个平台)的代码需要把这个接口具体实现。实现的规则需要按照内核对这块的规则开开发。目录结构的体会:进入kernel-2.6.13/drivers/char,选择一个驱动文件qq2440_buttons.c友善之臂的按键驱动,观察它include的头文件。有两种,一个是linux目录下,一个是在ams目录下,linux目录下.h文件应该为linux内核系统独立于硬件体系结构之上的文件。而asm目录呢,是和平台结构有关的代码。由于每次系统采用的平台可能不一样,所以可以看到asm目录是一个软连接,在include目录下有各种体系结构的头文件目录,如asm-arm,asm-i386,,所以通用的是asm目录,而在每种平台下开发时,就将asm软连接到某个平台目录,那么我们再进入平台子目录,以asm-arm为例,其实就是进入asm目录,这两个其实是一个,因为软连接了,就是这样。进入后我们发现这个目录下还有一个目录arch这个也是软连接,链接到了arch-s3c2410,说明什么?刚才在上一个目录中我们选择了arm体系结构,进入arm之后,看到是什么?不同的开发板,这样说更形象,更易于理解。因为不同的开发板,硬件的设计,是存在不一样的,所以驱动的开发肯定是不一样的。这里呢?说明我们的开发板就是基于三星的2410开发板了。该arch目录下除了开发板目录外,还有其他一些.h文件,这些文件当然应该理解为独立于开发板硬件的处理程序了,只要是arm体系处理器就ok,通用的了。再推测一下,驱动移植需要改什么呢?移植就是可以参考现有的平台,开发板进行加工,比如刚才我们讨论的就可能需要对arch-s3c2410目录下的文件进行修改。而该目录下又仅仅是.h头文件,很显然不足,他肯定有.c文件是更底层的操作各种硬件的具体实现。这在那个位置呢?kernel-2.6.13/arch/arm/mach-s3c2410,分析的方法很类似,内核目录下有个arch目录,该目录下放置了各种体系结构,各种开发板下的功能具体实现的.c文件,也有通用的.c文件。这样就清楚一些了。我们可以验证一下我们刚才的理解,我们进入linux系统的源码目录的include文件夹,/usr/src/linux-2.4/include,我们看到和刚才的很类似,有各种体系结构的文件夹和一个asm软连接,它连到哪呢?按照刚才的理解,计算机的体系结构为386,所以应该连接到asm-i386.ll看一下结果。lrwxrwxrwx1rootroot8Oct218:02asm-asm-i386没有问题,正如所料。这个asm软连接很巧妙,在公共的接口下又提供了不同的扩展空间。驱动中的open,read等也是异曲同工。