Linux驱动编程 step-by-step (三) 字符设备中 重要的数据结构

转载 2012年03月21日 10:13:19
字符设备中 重要的数据结构
大部分字符驱动设计三个重要的数据结构
<linux/fs.h>
struct file_operations
struct file
struct inode
 
一、文件操作
           在之前的一篇文章中已经有介绍了如何去生情字符设备设备号,但是没有做任何的工作,也就只能写一个不能工作的字符设备;
struct file_operations 结构域用来连接设备与操作,实现系统调用。
重要字段介绍:
struct file_operations {
    struct module *owner;//表示拥有这个结构模块的指针,几乎所有的驱动都会设置为THIS_MODULE<linux/module.h>
    loff_t (*llseek) (struct file *, loff_t, int);//文件读写位置调整函数
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//从设备读取数据
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//项设备写入数据
    unsigned int (*poll) (struct file *, struct poll_table_struct *);//查询文件描述符上的读取写入是否被阻塞
    int (*mmap) (struct file *, struct vm_area_struct *);//将设备内存映射到进程空间
    int (*open) (struct inode *, struct file *);//对应于打开设备
    int (*release) (struct inode *, struct file *);//对应于关闭一个设备
    .
    .
    .
};
结构还有很多的操作因为还没有学会,就没有多做介绍,(ioctl函数操作在2.6.35之后就变成了unlocked_ioctl、compat_ioctl其实作用也不是很大 也没有做介绍,以后有机会再做介绍)
当open 与release置为NULL时 就以内核默认的方式进行打开或者关闭,并且不会出错,
当其他函数没有被定义时候,应用程序调用会出错。
下边是一个最重要的几个设备操作方法的定义。
struct file_operations simple_fops={
    .owner   = THIS_MODULE,
    .open    = simple_open,
    .release = simple_close,
    .read    = simple_read,
    .write   = simple_write,
    .llseek  = simple_llseek,
    .poll    = simple_poll,
    .mmap    = simple_mmap,
};

二、file结构
这里介绍的file结构并不是C语言中的FILE结构,两者没有任何关联,struct file只是一个内核的结构,每一个打开的文件,都会对应一个struct file结构,一个文件可以对应于不同的struct file结构
struct file {
    struct path    f_path; //文件位置
    const struct file_operations    *f_op;.//文件操作符
    spinlock_t    f_lock; 
    atomic_long_t    f_count;
    unsigned int     f_flags;//文件标识(O_NONBLOCK, O_RDONLY等由应用程序传入)
    fmode_t    f_mode;//文件模式可读可写
    loff_t      f_pos;//文件读写位置
    struct fown_struct    f_owner;
    const struct cred   *f_cred;
    struct file_ra_state  f_ra;
    .
    .
    .
    void       *private_data; //most important!! 私有数据,驱动可以使用它指向任何的数据结构

};
三、inode结构
linux内核使用inode结构表示一个文件,与file不同,file可以理解为用来表示文件描述符的结构,一个文件可以对应很多的文件描述符,而最后只会指向同一个inode结构

struct inode {
    ...
    dev_t       i_rdev; //保存设备号
        union {
        struct pipe_inode_info    *i_pipe;
        struct block_device   *i_bdev;
        struct cdev    *i_cdev; //指向了struct cdev结构
    };
    ...
};

四、file 结构 与inode结构图解

Linux驱动编程 step-by-step (三) 字符设备中 重要的数据结构

字符设备中 重要的数据结构 大部分字符驱动设计三个重要的数据结构 struct file_operations struct file struct inode   一、文件操...
  • a8039974
  • a8039974
  • 2014年11月14日 22:43
  • 391

Linux驱动编程 step-by-step (三)

字符设备中 重要的数据结构 大部分字符驱动设计三个重要的数据结构 struct file_operations struct file struct inode   一、文件操...
  • jshazk1989
  • jshazk1989
  • 2011年11月05日 16:11
  • 3061

Linux驱动编程 step-by-step (三) .

字符设备中 重要的数据结构 大部分字符驱动设计三个重要的数据结构 struct file_operations struct file struct inode   一、文件操...
  • huzm08
  • huzm08
  • 2011年11月15日 08:54
  • 118

Linux驱动编程 step-by-step (五)

主要的文件操作方法实现 文件操作函数有很多的操作接口,驱动编程需要实现这些接口,在用户编程时候系统调用时候会调用到这些操作 struct file_operations { ... loff_...
  • jshazk1989
  • jshazk1989
  • 2011年11月11日 00:35
  • 7724

Linux驱动编程 step-by-step (四)

似乎每一章介绍的内容比较少,但学习是一个循序渐进的过程,不在于一天学多少,重要的一天能真正的学懂多少,所以我主张一步一步来,从多个渠道去学习知识,实现互补。 本节测试代码传到此处了:char_ste...
  • jshazk1989
  • jshazk1989
  • 2011年11月05日 23:48
  • 3308

Linux驱动编程 step-by-step (一)

转载于: http://blog.csdn.net/jshazk1989/article/details/6908472 驱动程序的作用: 简单来说 驱动程序就是使计算机与设备通...
  • guoyaoyao1990
  • guoyaoyao1990
  • 2014年07月13日 16:57
  • 346

Linux驱动编程 step-by-step (十一)

Linux 内核链表(2) 之前描述了如何创建内核链表(INIT_LIST_HEAD)向链表中添加节点(list_add)删除一个链表节点(list_del)获取一个链表节点对应的结构体(list_...
  • a8039974
  • a8039974
  • 2014年11月14日 22:50
  • 291

Linux驱动编程 step-by-step (七)

并发 竞态 (信号量与自旋锁) 代码传至并发竞态控制 并发进程 导致竞态的一个例子 前面所述的字符驱动都是没有考虑并发竟态的情况,想象一下 一个进程去读一个字符设备,另一个进程在同...
  • jshazk1989
  • jshazk1989
  • 2011年11月17日 00:24
  • 5729

Linux驱动编程 step-by-step (九)

字符设备模拟pipe的驱动程序 让我们用一个”pipe“的设备驱动去结束简单字符设备吧(这里所说的pipe并非标准的pipe只是模拟了一个从一端写入从另一端写入的设备) 测试代码1      测试...
  • jshazk1989
  • jshazk1989
  • 2011年11月29日 23:17
  • 2863

Linux驱动编程 step-by-step (八)

阻塞型字符设备驱动 前面说到了 如何实现read write 等操作,但如果设备缓冲已满,现在想而用户此时又想写入设备,此请求就无法立即执行,那怎么办呢? 第一种情况是:驱动程序想用户返回请求失败...
  • jshazk1989
  • jshazk1989
  • 2011年11月24日 00:31
  • 2404
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动编程 step-by-step (三) 字符设备中 重要的数据结构
举报原因:
原因补充:

(最多只允许输入30个字)