系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在 应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作.比如read(),就像读文件一样操作设备。设备驱动程序是内核的一部分,它完成以下的功能:
1.对设备初始化和释放.
2.把数据从内核传送到硬件和从硬件读取数据.
3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据. 数据在用户空间 系统空间 硬件之间流动。
4.检测和处理设备出现的错误.
linux操作系统设备分3种:字符设备 块设备 网络设备。其中字符设备与块设备的区别是,访问数据的方式不同,字符设备是连续访问,不可跳跃访问,是一种流方式,不访问前面的就得不到后面的。而块设备是可以按地址访问的。网络设备就很不同了,暂时没研究过。
每个设备都有其主设备号和从设备号,每个设备驱动都有一个主设备号,设备与对应的设备驱动的主设备号必须相同。而从设备号是用来区分使用同一种驱动的不同设备。用户访问的时候也是先通过具体设备获得主设备号,再通过主设备号找到对应的设备驱动。然后使用设备驱动对设备进行操作。其中:设备驱动的主设备号是其在加载的时候申请的,可以是系统配置,也可以是自己配置,但申请成功都会在内核中记载,那么为了让使用这个驱动的设备与其保持相同的主设备号,就要给该设备指定主设备号(mknod /dev/test c major minor)从设备号可以使用系统自动分配。
关于设备节点/dev 设备节点对应于操作系统分配的资源,但设备节点并不一定对应于物理设备,这时候叫做僞设备,比如说用mknod /dev/test test就是僞设备节点。先有驱动,才有设备节点。设备文件之所以叫设备文件是因为用户操作的是它,且把它当做文件操作,如myflie=open("/dev/global",O_RDWR);而设备节点,是因为实际的操作并不在此,这只是中间的的一个过程,一个节点而已,实际的操作还在驱动中实现。
关于次设备号:驱动程序,每发现一个它能驱动的设备,就创建一个设备对象,并为其分配一个次设备号以区分不同的设备,这样当应用程序访问设备节点时驱动就可以根据次设备号知道它访问的设备了。其实创建设备节点可以是手动的,也可以由系统分配,就是udev创建的设备文件。
myflie=open("/dev/global",O_RDWR);这是应用程序中的代码,其中的/dev/global就是设备节点,或叫做设备文件,设备文件中有主从设备号,通过主设备号找到驱动程序,同时把从设备号传送给驱动程序,驱动程序通过从设备号找到所要操作的设备。