linux对字符设备和块设备的操作就抽象成对其相应的设备文件的操作,那linux的字符和块设备文件在存在哪呢?如果在存在磁盘的话,那先要访问磁盘块设备文件,再去磁盘读取,可是块设备文件本身就在磁盘上,又怎么读取快设备文件呢?不知道描述的清楚不,小弟现在对于设备文件很糊涂啊,谢谢大家解释
------解决方案--------------------
设备文件一般是存放在/dev 这个目录下,你可以打开看一下,有个dsp吧,或者说是dsp1,对应的是mixer或mixer1,这2个是音频的编程接口。
对于块设备我没有做过,实在不敢乱说。只知道块设备相对于字符设备在数据流一级是需要缓冲的,估计也就是说读写的数据是以块的形式进行的,数据不会像字符设备那样会马上就可以进行了,需要缓冲满。在地址访问一级似乎也不一样。不知道块设备驱动模型是不是和字符设备很相似,做过的同志应该是很清楚的。
设备文件和一般文件是不一样的。
我记得好像给你解释过这个问题的呀。
设备文件是驱动程序和应用程序的接口,读写设备文件(比如说音频设备文件)并不是直接读写设备里的数据,而是在“调用”驱动程序。对于应用层编程的人来说,这个他不需要明白,他感觉读写设备文件好像就是在读写设备,其实是错的,但对于他们来说没有什么影响,本身驱动模型的设计就是这个目的,要让上层编程的人觉得就是在直接操作硬件而编写起程序就很简单。但这个错误的认识如果在编写驱动层的我们来说就要不得了,如果自己都没有一个准确的认识,这驱动程序肯定是不行的。
就那简单的代码来说:
1.int fd = open("/dev/dsp",O_RDWR);//打开音频设备文件,这是经由文件系统建立与音频驱动程序的联系
write(fd,buf,sizeof(buf));//向设备文件写音频数据以播放,内核的文件系统在识别这个是设备文件(注意不是普通文件)时,会调用相应的驱动程序dsp_write()去将数据写进声卡,这样就有声音了。
read()类似,只是数据流向相反。
2.int fd = open("/home/ganda.mp3",O_RDWR);//打开普通的磁盘文件,这是经由文件系统建立与磁盘驱动程序的联系
write(fd,buf,sizeof(buf));//向音频文件写音频数据以存储,内核的文件系统在识别这个是普通文件(注意不是设备文件)时,会调用相应的磁盘驱动程序去将数据写进磁盘,这样就存到磁盘上了。注意这里的这个操作与声卡无关。read()类似,只是数据流向相反。