文件相关内核数据结构
2014-01-02 17:46
148 查看
作者:冯利美,华清远见嵌入式学院讲师。
一、struct file
系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。struct file结构体定义在/linux/include/linux/fs.h。
该结构体中含有文件的属性:包括
1、mode_t f_mode
对文件的读写模式,对应系统调用open的mod_t mode参数。如果驱动程序需要这个值,可以直接读取这个字段。mod_t被定义为unsigned int。
2、当前的文件指针位置,即文件的读写位置(loff_t f_pos) loff_t被定义为:long long
3、文件的所有者id,所有者所在组的id
二、与进程联系的文件系统相关结构
进程是通过文件描述符(file descriptor,fd)来访问文件的,每个进程最多能同时使用NR_OPEN个文件描述符,这个值在include/linux/limits.h中定义为1024。每一个进程用一个打开文件表files_struct来描述进程的文件描述符使用情况。每一个文件都有一个文件指针。
进程的task_struct中有文件系统相关的数据成员:
struct task_struct {
……
/* filesystem information */
struct fs_struct *fs;
/* open file information */
struct files_struct *files;
……
};
结构fs_struct给出了与进程相关的文件系统的信息,比如进程自己的当前工作目录,它的根目录等。
还有一个表表示进程打开的文件,即task_struct结构的files_struct类型的files字段。它给出了所有的进程描述符的使用情况,其file结构指针数组成员给出了文件描述符的信息,其定义如下:
include/linux/fdtable.h
struct files_struct {
……
/* 文件描述符表 */
struct fdtable *fdt;
struct fdtable fdtab;
/* 文件对象指针的初始化数组 */
struct file * fd_array[NR_OPEN_DEFAULT];
};
文件描述符表的所有元素被放在一个单独的结构——struct fdtable中。即fdtable结构是进程的文件描述符表,其定义如下:
include/linux/fdtable.h
struct fdtable {
……
unsigned int max_fds;
struct file ** fd; /* current fd array */
fd_set *open_fds;
struct fdtable *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 {
unsigned long fds_bits [__FDSET_LONGS];
} __kernel_fd_set;
三、打开文件的内核数据结构
每个进程中有一张打开文件描述符表(struct task_struct→struct files_struct→struct fdtable→struct file ** fd 在fd数组中有元素的每个文件来说,数组的索引就是文件描述符)。可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:a)文件描述符标志。b)指向一个文件表项的指针(struct file*)。
一、struct file
系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。struct file结构体定义在/linux/include/linux/fs.h。
该结构体中含有文件的属性:包括
1、mode_t f_mode
对文件的读写模式,对应系统调用open的mod_t mode参数。如果驱动程序需要这个值,可以直接读取这个字段。mod_t被定义为unsigned int。
2、当前的文件指针位置,即文件的读写位置(loff_t f_pos) loff_t被定义为:long long
3、文件的所有者id,所有者所在组的id
二、与进程联系的文件系统相关结构
进程是通过文件描述符(file descriptor,fd)来访问文件的,每个进程最多能同时使用NR_OPEN个文件描述符,这个值在include/linux/limits.h中定义为1024。每一个进程用一个打开文件表files_struct来描述进程的文件描述符使用情况。每一个文件都有一个文件指针。
进程的task_struct中有文件系统相关的数据成员:
struct task_struct {
……
/* filesystem information */
struct fs_struct *fs;
/* open file information */
struct files_struct *files;
……
};
结构fs_struct给出了与进程相关的文件系统的信息,比如进程自己的当前工作目录,它的根目录等。
还有一个表表示进程打开的文件,即task_struct结构的files_struct类型的files字段。它给出了所有的进程描述符的使用情况,其file结构指针数组成员给出了文件描述符的信息,其定义如下:
include/linux/fdtable.h
struct files_struct {
……
/* 文件描述符表 */
struct fdtable *fdt;
struct fdtable fdtab;
/* 文件对象指针的初始化数组 */
struct file * fd_array[NR_OPEN_DEFAULT];
};
文件描述符表的所有元素被放在一个单独的结构——struct fdtable中。即fdtable结构是进程的文件描述符表,其定义如下:
include/linux/fdtable.h
struct fdtable {
……
unsigned int max_fds;
struct file ** fd; /* current fd array */
fd_set *open_fds;
struct fdtable *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 {
unsigned long fds_bits [__FDSET_LONGS];
} __kernel_fd_set;
三、打开文件的内核数据结构
每个进程中有一张打开文件描述符表(struct task_struct→struct files_struct→struct fdtable→struct file ** fd 在fd数组中有元素的每个文件来说,数组的索引就是文件描述符)。可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:a)文件描述符标志。b)指向一个文件表项的指针(struct file*)。
相关文章推荐
- Linux3.0.0内核中客体(如文件/目录)相关的DAC安全数据结构(传统9Bit模块、ACL模式)
- linux kernel 3.8 Prominent features (filesystem )3.8内核最新属性 文件系统相关
- linux内核2.6.28调度相关的数据结构分析
- Linux2.6X内核中文件相关结构体总结
- 再读内核存储管理(2):相关的数据结构
- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
- Windows内核常见数据结构(线程相关)
- Linux 2.4.30 内核文件系统学习(多图) 1 : 关键数据结构
- 转 -- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
- 文件系统相关知识 以及根据文件系统原理设计内核缓冲区
- Windows内核常见数据结构(进程相关)
- Windows内核常见数据结构(驱动相关)
- 构建x86内核+ramdisk文件系统相关资料
- Linux 内核clk相关数据结构描述
- 文件相关内核数据结构
- 如何移除Ubuntu内核源码树中老版本的内核相关文件
- 关于文件的几个内核数据结构
- Linux2.6X内核中文件相关结构体总结
- Linux下内核相关的三个文件详解