字符设备驱动--- 设备操作

来源:互联网 发布:创意嘉和软件 编辑:程序博客网 时间:2024/04/29 22:36

设备操作:

(1)  int  ( *open )  ( struct  inode * , struct file *)

        在设备文件上的第一个操作,并不要求驱动程序一定要实现这个方法.

        如果该项为 NULL ,设备的打开操作永远成功.

(2)  void  ( * release ) ( struct  inode *, struct file *)

        当设备文件被关闭时调用这个操作.

        与 open 相仿, release 也可以没有.

(3)  ssize_t ( *read ) ( struct file * ,char _user * , size_t , loff_t * )

        从设备中读取数据.

(4)  ssize_t ( *write ) ( struct file * , const char _user * , size_t , loff_t * )

        从设备中发送数据.

(5)  unsigned int ( * poll ) ( struct file *, struct poll_table_struct *)

        对应 select 系统调用.

(6)  int  ( * ioctl ) ( struct inode * ,struct file * , unsigned int , unsigned long )

        控制设备.

(7)  int ( * mmap ) ( struct file *, struct vm_area_struct *)

        将设备映射到进程虚拟地址空间中.

(8)  off_t ( * llseek ) ( struct file *, loff_t , int )  

        修改文件的当前读写位置,并将新位置作为返回值.


方法:

(1)  open 方法:

        open 方法是驱动程序用来为以后的操作完成初始化准备工作的,在大部分驱动程序中,

        open 完成如下工作:

                1,初始化设备.

                2,标明次设备号.

(2)  release 方法:

        release 方法的作用正好与 open 相反,这个设备方法有时也称 close .

        作用:

                关闭设备.

(3) 读和写:

        读和写方法都完成类似的工作:从设备中读取数据到用户空间;将数据传递到驱动程序.

        它们的原型也相当相似:

        ssize_t xxx_read ( struct file *filp  ,char _user * buff, size_t  count, loff_t * offp)

        ssize_t xxx_write ( struct file *filp , char _user * buff , size_t count, loff_t * offp )

                                                文件指针     指向的数据缓存     请求传输的数据量   指出文件当前访问位置

(4) 注意 buff  :

        read 和 write 方法的 buff  参数是用户空间指针, 因此,它不能被内核代码直接引用,

        理由如下:用户空间的指针在内核空间时可能根本是无效的---没有那个地址的映射.

(5)  内核的读写:

        内核提供了专门的函数用于访问用户空间的指针:

        int  copy_from_user ( void *to , const void _user *from , int n ).

        int  copy_to_user ( void _user *to , const void *from , int n ).


读写是站在用户空间的角度来说的.











原创粉丝点击