Структуры VFS, описывающие открытый файл в Linux

Сокращенный вариант структур данных в ядре Linux 2.2.26. Структуры описаны в include/linux/{sched.h,fs.h,dcache.h}.

ФД -файловый дескриптор, ФС - файловая система

Данные о процессе в ядре

struct task_struct {
...
  struct files_struct *files; //информация об открытых файлах процесса
...
}

Информация об открытых файлах процесса

struct files_struct {
  atomic_t count; //количество открытых файлов
  int max_fds; //максимальное доступное количество ФД
  int max_fdset;  //максимальный номер использованного ФД
  int next_fd;  //минимальный свободный номер ФД
  fd_set *close_on_exec; //битовая карта ФД, которые необходимо закрыть при вызове exec()
  fd_set *open_fds;  //битовая карта открытых ФД
  struct file * fd_array[NR_OPEN_DEFAULT]; //массив указателей на открытые файлы
...
};

Свойства открытого в процессе файла

struct file {
  struct dentry *f_dentry; //ссылка на запись в каталоге (имя и inode файла)
  struct file_operations *f_op; //указатели на функции драйвера ФС для работы с файлом
  atomic_long_t f_count; //количество открытых файловых дескрипторов процесса, указывающих на файл
  unsigned int f_flags; //флаги, указанные при открытии
  loff_t f_pos; //позиция головки ввода/вывода
  fmode_t f_mode; //права доступа в момент открытия
  struct fown_struct  f_owner; //uid,gid файла в момент открытия
...
  void *private_data; //место для хранения специфичных для драйвера данных
};

Запись в каталоге

struct dentry {
  struct inode *d_inode; 
  struct qstr d_name;
...
}

Inode

struct inode {
...
  kdev_t i_dev; //номер устройства, на котором расположен inode
  unsigned long i_ino; //номер inode
  umode_t i_mode;//права доступа
  nlink_t i_nlink; //число имён
  uid_t i_uid;
  gid_t i_gid;
...
  struct super_block *i_sb; // ссылка на суперблок ФС
...
  unsigned int i_count; //общее число ФД, ссылающихся на этот файл
  struct file_lock * i_flock; //блокировки файла
...
}

Указатели на операции с файлом в драйвере ФС

struct file_operations { 
  int (*open) (struct inode *, struct file *);
  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 *);
  int (*flush) (struct file *);
  int (*release) (struct inode *, struct file *);
...
}
Прикрепленный файлРазмер
Иконка изображения fd_tables.png10.19 КБ