Роберт Лав - Разработка ядра Linux
- Название:Разработка ядра Linux
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2006
- Город:Москва
- ISBN:5-8459-1085-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Роберт Лав - Разработка ядра Linux краткое содержание
В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.
Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Разработка ядра Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
struct qstr *name1, struct qstr *name2);
Эта функция вызывается подсистемой VFS для сравнения двух имен файлов name1
и name2
. Большинство файловых систем используют умолчание VFS, которое соответствует простому сравнению двух строк. Для некоторых файловых систем, таких как FAT, не достаточно простого сравнения строк. Файловая система FAT не чувствительна к регистру символов в именах файлов, поэтому появляется необходимость в реализации функции, которая при сравнении не учитывает регистр символов. Эта функция вызывается при захваченной блокировке dcache_lock
[73] А также при захваченной блокировке dentry->d_lock . — Примеч. перев .
.
• int d_delete(struct dentry *dentry);
Эта функция вызывается подсистемой VFS, когда количество ссылок d_count указанного объекта dentry становится равным пулю. Функция вызывается при захваченной блокировке dcache_lock
.
• void d_release(struct dentry *dentry);
Эта функция вызывается подсистемой VFS, когда она собирается освободить указанный объект dentry. По умолчанию данная функция не выполняет никаких действий.
• void d_iput(struct dentry *dentry, struct inode *inode);
Эта функция вызывается подсистемой VFS, когда элемент каталога теряет связь со своим файловым индексом (например, когда этот элемент каталога удаляется с диска). По умолчанию подсистема VFS просто вызывает функцию iput()
, чтобы освободить соответствующий объект inode. Если файловая система переопределяет эту функцию, то она также должна вызывать функцию iput()
в дополнение к специфичной для файловой системы работе.
Объект file
Последним из основных объектов подсистемы VFS рассмотрим объект файла. Объект File используется для представления файлов, которые открыты процессом. Когда мы думаем о подсистеме VFS с точки зрения пространства пользователя, то объект файла — это то, что первое приходит в голову. Процессы непосредственно работают с файлами, а не с суперблоками, индексами или элементами каталогов. Не удивительно, что информация, которая содержится в объекте file, наиболее привычна (такие данные, как режим доступа или текущее смещение), а файловые операции очень похожи на знакомые системные вызовы, такие как read()
и write()
.
Объект файла — это представление открытого файла, которое хранится в оперативной памяти. Объект (а не сам файл) создается в ответ на системный вызов open()
и уничтожается в результате системного вызова close()
. Все вызовы, связанные с файлом, на самом деле являются методами, которые определены в таблице операций с файлом. Так как несколько процессов могут одновременно открыть и использовать один и тот же файл, то для одного файла может существовать несколько объектов file. Файловый объект просто представляет открытый файл с точки зрения процесса. Этот объект содержит указатель на соответствующий элемент каталога (который, в свою очередь, указывает на файловый индекс), представляющий открытый файл. Соответствующие объекты inode и dentry, конечно, являются уникальными.
Файловый объект представляется с помощью структуры struct file
, которая определена в файле . Рассмотрим поля этой структуры с комментариями, которые описывают назначение каждого поля.
struct file {
struct list_head f_list; /* список объектов file */
struct dentry *f_dentry; /* связанный объект dentry */
struct vfsmount *f_vfsmnt; /* связанная смонтированная
файловая система */
struct file_operations *f_op; /* таблица файловых операций */
atomic_t f_count; /* счетчик ссылок на этот объект */
unsigned int f_flags; /* флаги, указанные
при вызове функции open */
mode_t f_mode; /* режим доступа к файлу */
loff_t f_pos; /* смещение в файле
(file pointer, offset) */
struct fown_struct f_owner; /* информация о владельце для обработки
сигналов */
unsigned int f_uid; /* идентификатор пользователя владельца, UID */
unsigned int f_gid; /* идентификатор группы владельца, GID */
int f_error; /* код ошибки */
struct file_ra_state f_ra; /* состояние предварительного считывания */
unsigned long f_version; /* номер версии */
void *f_security; /* модуль безопасности */
void *private_data; /* привязка для
драйвера терминала */
struct list_head f_ep_links; /* список ссылок eventpoll
(опрос событий) */
spinlock_t f_ep_lock; /* блокировка eventpoll */
struct address_space *f_mapping; /* отображение в страничном кэше */
};
По аналогии с объектом элемента каталога объект файла на самом деле не соответствует никакой структуре, которая хранится на жестком диске. Поэтому в этой структуре нет никакого флага, который бы указывал, что объект изменен (dirty) и требует обратной записи на диск. Объект file указывает на связанный с ним объект dentry с помощью указателя f_dentry
. Объект dentry в свою очередь содержит указатель на связанный с ним индекс файла, который содержит информацию о том, изменен ли файл.
Файловые операции
Как и для других объектов подсистемы VFS, таблица файловых операций является важной структурой. Операции, связанные со структурой struct file
, — это знакомые системные вызовы, составляющие основу системных вызовов ОС Unix.
Методы работы с файловым объектом хранятся в структуре file_operations
и определены в файле следующим образом.
struct file_operations {
struct module *owner;
loff_t (*llseek)(struct file*, loff_t, int);
ssize_t (*read)(struct file*, char*, size_t, loff_t*);
ssize_t (*aio_read)(struct kiocb*, char*, size_t, loff_t);
ssize_t (*write)(struct file*, const char*, size_t, loff_t*);
ssize_t (*aio_write)(struct kiocb*, const char*, size_t, loff_t);
int (*readdir)(struct file*, void*, filldir_t);
unsigned int (*poll)(struct file*, struct poll_table_struct*);
int (*ioctl)(struct inode*, struct file*, unsigned int, unsigned long);
int (*mmap)(struct file*, struct vm_area_struct*);
int (*open)(struct inode*, struct file*);
int (*flush)(struct file*);
int (*release)(struct inode*, struct file*);
int (*fsync)(struct file*, struct dentry*, int);
int (*aio_fsync)(struct kiocb*, int);
int (*fasync)(int, struct file*, int);
int (*lock)(struct file*, int, struct file_lock*);
ssize_t (*readv)(struct file*, const struct iovec*,
unsigned long, loff_t*);
ssize_t (*writev)(struct file*, const struct iovec*,
unsigned long, loff_t*);
ssize_t (*sendfile)(struct file*, loff_t*, size_t,
read_actor_t, void*);
ssize_t (*sendpage)(struct file*, struct page*, int,
size_t, loff_t*, int);
unsigned long (*get_unmapped_area)(struct file*, unsigned long,
unsigned long, unsigned long, unsigned long);
int (*check_flags)(int flags);
int (*dir_notify)(struct file *filp, unsigned long arg);
int (*flock)(struct file *filp, int cmd, struct file_lock *fl);
};
Файловые системы могут реализовать уникальную функцию для каждой из этих операций или использовать общий существующий метод. Общие методы нормально работают для обычных Unix-подобных файловых систем. Разработчики файловых систем не обязаны реализовать все эти функции, хотя основные методы должны быть реализованы. Если какой-либо метод не представляет интереса, то его можно установить в значение NULL
.
Интервал:
Закладка: