Linux 内核用于I/O的三个数据结构

转载 2012年02月02日 14:23:18

1 struct file:

系统中每个打开的文件在内核空间都有一个关联的structfile。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。structfile结构体定义在/linux/include/linux/fs.h。

该结构体中含有文件的属性:包括

1、mode_t f_mode

对文件的读写模式,对应系统调用open的mod_tmode参数。如果驱动程序需要这个值,可以直接读取这个字段。mod_t被定义为unsigned int。

2、当前的文件指针位置,即文件的读写位置(loff_t f_pos) loff_t被定义为:long long

3、文件的所有者id,所有者所在组的id

二、与进程联系的文件系统相关结构

进程是通过文件描述符(filedescriptor,fd)来访问文件的,每个进程最多能同时使用NR_OPEN个文件描述符,这个值在include/linux/limits.h中定义为1024。每一个进程用一个打开文件表files_struct来描述进程的文件描述符使用情况。每一个文件都有一个文件指针。

进程的task_struct中有文件系统相关的数据成员:

struct task_struct {
        ……
        /* filesysteminformation */
                structfs_struct *fs;
        /* open fileinformation */
                structfiles_struct *files;
        ……
        };

结构fs_struct给出了与进程相关的文件系统的信息,比如进程自己的当前工作目录,它的根目录等。

还有一个表表示进程打开的文件,即task_struct结构的files_struct类型的files字段。它给出了所有的进程描述符的使用情况,其file结构指针数组成员给出了文件描述符的信息,其定义如下:

include/linux/fdtable.h
        struct files_struct{
            ……
                /*文件描述符表 */
                structfdtable *fdt;
                structfdtable fdtab;
                /*文件对象指针的初始化数组 */
                structfile * fd_array[NR_OPEN_DEFAULT];
        };

文件描述符表的所有元素被放在一个单独的结构——struct fdtable中。即fdtable结构是进程的文件描述符表,其定义如下:

include/linux/fdtable.h
        struct fdtable {
            ……
                unsignedint max_fds;
                structfile ** fd; /* current fd array */
                fd_set*open_fds;
                structfdtable *next;
        };

fd字段指向文件对象指针数组。该数组的长度存放在max_fds中。通常,fd字段指向files_struct的fd_array字段,该字段包含32个文件对象指针。如果进程打开的文件数目多于32个,内核就分配一个新的、更大的文件指针数组,并将其地址放在fd中,内核也同时更新max_fds字段的值。

对于在fd数组中有元素的每个文件来说,数组的索引就是文件描述符。Unix进程将文件描述符作为主文件标识符。两个文件描述符可以指向同一个打开的文件。

进程不能使用多于NR_OPEN个文件描述符。open_fds字段最初包含open_fds_init字段的地址,open_fds_init表示当前已打开文件描述符的位图。max_fds字段存放位图中的位数。

fd_set结构是文件描述符集,它将同一种情况下的多个文件描述符放在一起。在include/linux/types.h有中定义:

typedef __kernel_fd_set fd_set;
        __kernel_fd_set结构在include/linux/posix_types.h中定义:
        typedef struct {
            unsignedlong fds_bits [__FDSET_LONGS];
        } __kernel_fd_set;

三、打开文件的内核数据结构

每个进程中有一张打开文件描述符表(struct task_struct→struct files_struct→structfdtable→struct file ** fd在fd数组中有元素的每个文件来说,数组的索引就是文件描述符)。可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:a)文件描述符标志。b)指向一个文件表项的指针(structfile*)。


这三个数据结构决定了文件共享中,一个进程对另一个进程的作用:
  一、进程表中的记录项
  这个记录项为进程当前打开文件列表,每一的表项包含文件描述符标志和文件描述表的项的指针。
  二、文件表
  是内核为所有打开文件维持的一张表,其中没一项包括:文件状态标志(读,写,增等),文件当前位移量,只想V节点表的项的指针。
  三、V节点表

  每个打开文件(设备)都有一个V节点结构,V节点包含了文件类型和对此文件进行操作的函数的指针;V节点中还包含文件的I节点结构,i节点结构中保函文件所有者,长度,所在设备,只想实际磁盘数据块等(索引信息)。

如果多个进程同时打开一个文件,则各自拥有自己的文件表但是共同拥有V节点。在写文件的时候为了解决冲突问题,引入了原子操作,将“定位到文件结尾,然后写文件”作为一个完整的原子操作。


1.linux基本I/O接口介绍

1.linux基本I/O接口介绍 ssize_t read(intfd, void *buf, size_t count); ssize_t write(intfd, void *buf, siz...
  • hou512504317
  • hou512504317
  • 2016年04月07日 12:14
  • 1302

Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc)

【转】(转)Linux内核访问外设I/O资源的方式-静态映射(map_desc)方式 Linux内核访问外设I/O资源的方式 Author: Dongas Date: 08-08-02 ...
  • liuxd3000
  • liuxd3000
  • 2013年11月19日 10:48
  • 9039

Linux内核之数据结构--队列

前言Linux内核实现了以下常用的内建数据结构,主要有:   链表   队列   映射   二叉树 今天详细学习一下队列的知识,内核中的队列是以字节形式保存数据的,所以获取数据的时候,需要知...
  • lyc_stronger
  • lyc_stronger
  • 2016年07月28日 16:52
  • 1132

内核用于I/O的数据结构

这一篇中将介绍UNIX系统中I/O有关的数据结构,并针对数据结构而解释各个I/O操作的实现方法,另外介绍文件共享和原子操作。 (1)每一个进程在进程表中都有一个记录项,每个记录项中有一个打开的文件的...
  • zhccl
  • zhccl
  • 2012年07月13日 22:40
  • 1070

Linux块设备驱动(四)————块设备的数据结构与相关操作及I/O调度器

0、数据从内存到磁盘的过程 内存是一个线性的结构,Linux系统将内存分为页。一页最大可以是64KB,但是目前主流的系统页的大小都是4KB。每一页的数据会被先封装成一个段,用bio_vec表示...
  • yangguoyu8023
  • yangguoyu8023
  • 2017年04月23日 00:04
  • 185

linux的I/O多路转接select的fd_set数据结构和相应FD_宏的实现分析

http://my.oschina.net/u/870054/blog/212063 在linux实现中,首先为长整形声明别名__fd_mask 1 ...
  • wangyin159
  • wangyin159
  • 2015年08月29日 17:01
  • 592

linux系统编程之文件与I/O(五):文件的内核结构file和dup实现重定向

一、打开文件内核数据结构 1、一个进程打开两个文件 文件状态标志:读、写、追加、同步、非阻塞等2、一个进程两次打开同一文件 3、两个进程打开同一文件 /****************...
  • Sandeldeng
  • Sandeldeng
  • 2016年10月22日 23:57
  • 154

linux系统编程之文件与I/O(五):文件的内核结构file和dup实现重定向

一、打开文件内核数据结构 1、一个进程打开两个文件 文件状态标志:读、写、追加、同步、非阻塞等 2、一个进程两次打开同一文件 3、两个进程打开同一文件 示例程序:  C++...
  • Simba888888
  • Simba888888
  • 2013年05月14日 16:51
  • 3106

caffe入门(二) caffe数据结构和I/O模块、caffe模型、正反向传播,

一、数据结构 1、Blob Blob是一个四维数组,维度从低到高为:whidth_,height_,channels_,num_ Bloc blob; int w=blob.width(); int ...
  • luchengtao11
  • luchengtao11
  • 2017年04月05日 17:23
  • 667

Linux环境编程之文件I/O(四):文件I/O的数据结构

(一) Linux系统支持不同进程间共享打开的文件。
  • To_Be_IT_1
  • To_Be_IT_1
  • 2014年05月11日 11:37
  • 957
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 内核用于I/O的三个数据结构
举报原因:
原因补充:

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