对于不支持中断的设备,读写时需要轮询设备状态,以及决定是否需要继续进行数据传输,例如,打印机。如果设备支持中断,则可按照中断方式进行。
Linux内核在结构体file_operations中统一定义了设备文件的各个访问接口。该结构体如下所示。
设备驱动程序加载时,首先会在内核中注册对应的设备号和结构体file_operations。应用程序通过系统调用访问设备时,内核会根据设备号查找到相应的结构体file_operations,然后再根据结构体file_operations中的接口调用具体放入设备的访问函数。
设备驱动程序开发的主要内容之一就是实现结构体file_operations中各个接口对应的函数。以下是file_operations中一些最基本的接口。
(1)int(*open)(structinode*,structfile*)
对应的系统调用:open()。
作用:检查设备是否就绪,验证设备号的合法性。
参数file:设备文件的指针。
(2)int(*release)(structinode*,structfile*)
对应的系统调用:close()。
作用:停止设备工作,释放资源等。
返回值:返回0表示成功,返回负数表示出现错误。
(3)ssize_t(*read)(structfile*,char_user*,size_t,loff_t*)(www.xing528.com)
对应的系统调用:read()。
作用:读取设备中的数据。
返回值:返回非负数表示读取设备的字节数(signedsize)。
(4)ssize_t(*write)(structfile*,constchar_user*,size_t,loff_t*)
对应的系统调用:write()。
作用:把数据写入设备。
返回值:返回非负数表示写入设备的字节数。
(5)loff_t(*llseek)(structfile*,loff_t,int)
作用:修改设备文件的当前读写位置。
返回值:返回非负数表示修改后的读写位置。
(6)int(*ioct1)(structinode*,structfile*,unsignedint,unsignedlong)
作用:传输设备的控制信息或获取设备的状态信息。
返回值:返回非负数表示修改后的读写位置。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。