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 (九)字符设备模拟pipe的驱动程序

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

Linux驱动编程 step-by-step (二) 简单字符设备驱动

简单字符设备驱动 1、主次设备号 主设备号标识设备连接的的驱动,此设备好由内核使用,标识在相应驱动下得对应的设备 在linux中设备号是一个32位的dev_t类型 typedef __u3...

嵌入式Linux字符设备驱动程序的主要数据结构

1)struct cdev:在内核中代表一个字符设备驱动(char device,cdev),每一个字符设备驱动都有一个struct cdev结构体变量与之对应,记录该设备驱动的相关信息,主要包括设备...
  • zbatp
  • zbatp
  • 2012年10月27日 20:53
  • 851

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

字符设备中 重要的数据结构 大部分字符驱动设计三个重要的数据结构 struct file_operations struct file struct inode   一、文件操...

linux设备驱动第三版笔记---->linux驱动重要数据结构之file_operations

要在linux下做驱动,细节很重要 接下来的三个数据结构linux驱动工程师必须懂的--àFile_operations,file,inode 先介绍file_operations; struc...

linux设备驱动第三版笔记---->linux驱动重要数据结构之struct file

文件结构 struct file --> 注意:struct file 与应用空间的FILE指针的区别 1、FILE指针定义在C库中,不在内核空间出现 2、struct file是内核结构,不...

Linux驱动编程--字符设备文件注册

CreateClass DestroyClass

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

阻塞型字符设备驱动 前面说到了 如何实现read write 等操作,但如果设备缓冲已满,现在想而用户此时又想写入设备,此请求就无法立即执行,那怎么办呢? 第一种情况是:驱动程序想用户返回请求失败...

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

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

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

说点上节没有讲完的话题 用户地址检测 简单模块调试 以及一些杂项 检测用户空间地址的有效性 上一节中提到在read write时候要检测用户空间传递的参数地址是否是有效地址,有的内核函数会自...
  • huzm08
  • huzm08
  • 2011年11月15日 08:58
  • 135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动编程 step-by-step (三) 字符设备中 重要的数据结构
举报原因:
原因补充:

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