当前位置: 技术问答>linux和unix
设备文件作用是什么啊,大家帮忙解释下,谢谢~
来源: 互联网 发布时间:2016-09-29
本文导语: 是不是对字符设备(比如键盘)读操作,就抽象成了对相应的字符设备文件的读操作呢。那块设备(如磁盘),读操作可以直接读磁盘中的文件啊,不需要块设备文件啊。这是怎么回事呢?大牛帮小弟解释下,字符设...
是不是对字符设备(比如键盘)读操作,就抽象成了对相应的字符设备文件的读操作呢。那块设备(如磁盘),读操作可以直接读磁盘中的文件啊,不需要块设备文件啊。这是怎么回事呢?大牛帮小弟解释下,字符设备文件和块设备文件的作用是什么啊?感激不尽~~
|
设备文件是应用程序与驱动程序交互的接口。
//是不是对字符设备(比如键盘)读操作,就抽象成了对相应的字符设备文件的读操作呢?
是的,为便于应用程序的编程,将设备抽象成了对相应的字符设备文件,读写设备文件就是在操作相应的设备,不可能直接操作硬件设备,用户态下无法直接访问硬件设备的地址空间。读写设备文件后经由内核的驱动程序管理模块来调用相应的驱动程序去直接操作硬件,这也就是系统调用。不过一般驱动程序也是分层的,有与硬件直接打交道的,有与应用程序接口的,有的驱动程序还嵌套其他的驱动程序,这样分层也是为了便于调试维护和移植。
//那读取磁盘文件时块设备文件的作用是什么呢?
读取磁盘文件时就需要读写块设备文件,以间接调用相应的磁盘驱动去读写磁盘文件。不能直接读取磁盘文件,虽然你调用了read()、write()、fread()、fwrite()来读写了文件,但这些都不是直接在读写磁盘文件,直接读写磁盘文件的过程和操作在驱动程序中。建议你看一下设备驱动开发详解的内容,试着写个简单的驱动程序就能弄清楚这个概念问题。
//是不是对字符设备(比如键盘)读操作,就抽象成了对相应的字符设备文件的读操作呢?
是的,为便于应用程序的编程,将设备抽象成了对相应的字符设备文件,读写设备文件就是在操作相应的设备,不可能直接操作硬件设备,用户态下无法直接访问硬件设备的地址空间。读写设备文件后经由内核的驱动程序管理模块来调用相应的驱动程序去直接操作硬件,这也就是系统调用。不过一般驱动程序也是分层的,有与硬件直接打交道的,有与应用程序接口的,有的驱动程序还嵌套其他的驱动程序,这样分层也是为了便于调试维护和移植。
//那读取磁盘文件时块设备文件的作用是什么呢?
读取磁盘文件时就需要读写块设备文件,以间接调用相应的磁盘驱动去读写磁盘文件。不能直接读取磁盘文件,虽然你调用了read()、write()、fread()、fwrite()来读写了文件,但这些都不是直接在读写磁盘文件,直接读写磁盘文件的过程和操作在驱动程序中。建议你看一下设备驱动开发详解的内容,试着写个简单的驱动程序就能弄清楚这个概念问题。
|
//那字符设备文件和块设备文件都在哪里存储的呢?不能在磁盘吧?
字符设备文件和块设备文件当然是在磁盘上呀。为什么是在磁盘上呢,因为这样做就经过了文件系统这一级的“封装”而统一接口,你想为什么用open(),read(),write()就可以与成千上万种驱动交互(当然有的驱动不这样)。内核利用文件系统来统一接口,来区分是在调用什么什么驱动程序。设备文件在磁盘上,但不同于普通文件,它里面并没有存放相应的设备数据(这是站在驱动层说的,而在应用层可以这么错误的理解)。驱动在加载时已经把相应的信息注册到了内核中(具体是哪块我也不清楚,可能是在文件系统中吧)。文件系统在识别了这个打开的文件后在驱动列表中找到相应的驱动程序就可调用相应的驱动程序来与应用层交互,所以这之间还有文件系统作为“传话人”。
字符设备文件和块设备文件当然是在磁盘上呀。为什么是在磁盘上呢,因为这样做就经过了文件系统这一级的“封装”而统一接口,你想为什么用open(),read(),write()就可以与成千上万种驱动交互(当然有的驱动不这样)。内核利用文件系统来统一接口,来区分是在调用什么什么驱动程序。设备文件在磁盘上,但不同于普通文件,它里面并没有存放相应的设备数据(这是站在驱动层说的,而在应用层可以这么错误的理解)。驱动在加载时已经把相应的信息注册到了内核中(具体是哪块我也不清楚,可能是在文件系统中吧)。文件系统在识别了这个打开的文件后在驱动列表中找到相应的驱动程序就可调用相应的驱动程序来与应用层交互,所以这之间还有文件系统作为“传话人”。