zoukankan      html  css  js  c++  java
  • 3. file、inode结构体及chardevs数组等相关知识解析

    https://blog.csdn.net/zqixiao_09/article/details/50850004
    下图描述了Linux中虚拟文件系统,一般的设备文件与设备驱动程序间的函数调用关系

    上图展现了一个应用程序调用字符设备驱动的过程,在设备驱动程序的设计中,一般而言,会关系file和inode这两个结构体。
    用户空间使用open()函数打开一个字符设备fd = open("/dev/hello", o_READ);这一函数会调用两个数据结构struct inode{}&struct file{}.二者均在虚拟文件系统VFS处,下面对这两个数据结构进行解析:
    1、file文件结构体
    (1)在设备驱动中,这是非常重要的数据结构
    (2)这里的file与用户空间出现中的FILE指针式不同的,用户空间FILE是定义在C库中,从来不会出现在内核中。而struct file,确是内核中的数据结构,因此,它也不会出现在用户层程序中。
    (3)file结构体指示一个已经打开的文件(设备对应设备文件),其实系统中每个打开的文件在内核空间都有一个相应的struct file结构体,它由内核在打开文件时创建,并传递给在文件上进程操作的任何函数,直至文件被关闭。如果文件被关闭,内核就会释放相应的数据结构。
    (4)在内核源码中,struct file要么表示为file,或者为filp(意指“file pointer”), 注意区分一点,file指的是struct file本身,而filp是指向这个结构体的指针。
    下面是几个重要成员
    a -- fmode_t f_mode;
    此文件模式通过FMODE_READ, FMODE_WRITE识别了文件为可读的,可写的,或者是二者。在open或ioctl函数中可能需要检查此域以确认文件的读/写权限,你不必直接去检测读或写权限,因为在进行octl等操作时内核本身就需要对其权限进行检测。
    b -- loff_t f_pos;
    当前读写文件的位置。为64位。如果想知道当前文件当前位置在哪,驱动可以读取这个值而不会改变其位置。对read,write来说,当其接收到一个loff_t型指针作为其最后一个参数时,他们的读写操作便作更新文件的位置,而不需要直接执行filp ->f_pos操作。而llseek方法的目的就是用于改变文件的位置。
    c -- unsigned int f_flags;
    文件标志,如O_RDONLY, O_NONBLOCK以及O_SYNC。在驱动中还可以检查O_NONBLOCK标志查看是否有非阻塞请求。其它的标志较少使用。特别地注意的是,读写权限的检查是使用f_mode而不是f_flog。所有的标量定义在头文件中
    d -- struct file_operations *f_op;
    与文件相关的各种操作。当文件需要迅速进行各种操作时,内核分配这个指针作为它实现文件打开,读,写等功能的一部分。filp->f_op 其值从未被内核保存作为下次的引用,即你可以改变与文件相关的各种操作,这种方式效率非常高。

    e -- void *private_data;
    在驱动调用open方法之前,open系统调用设置此指针为NULL值。你可以很自由的将其做为你自己需要的一些数据域或者不管它,如,你可以将其指向一个分配好的数据,但是你必须记得在file struct被内核销毁之前在release方法中释放这些数据的内存空间。private_data用于在系统调用期间保存各种状态信息是非常有用的。

    /*********************************/

  • 相关阅读:
    六 Vue学习 首页 (下)
    【Python】xpath中为什么粘贴进去代码后老报错?如何在定位元素的时候准确找到定位切入点?
    【Python】if相关知识点
    【Python】获取翻页之后的各页面中的属性值。
    【Python】如何取到input中的value值?
    【Python】两个for循环嵌套练习
    【Python】自动化测试框架-共通方法汇总
    【Python】Python 打印和输出更多用法。
    【python】Python3 循环语句
    【Python+Selenium】猪猪练习成功版:csv文件的输入和输出(运行环境:python3.5版本)
  • 原文地址:https://www.cnblogs.com/Ocean-Star/p/9245663.html
Copyright © 2011-2022 走看看