Роберт Лав - Разработка ядра Linux
- Название:Разработка ядра Linux
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2006
- Город:Москва
- ISBN:5-8459-1085-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Роберт Лав - Разработка ядра Linux краткое содержание
В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.
Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Разработка ядра Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
int fs_flags; /* флаги типа файловой системы */
/* следующая функция используется для считывания суперблока с диска */
struct super_block*(*get_sb)(
struct file_system_type*, int, char*, void*);
/* эта функция используется для прекращения доступа к суперблоку */
void (*kill_sb)(struct super_block*);
struct module *owner; /* соответствующий модуль (если есть) */
struct file_system_type *next; /* следующая файловая система в списке */
struct list_head fs_supers; /* список объектов типа суперблок */
};
Функция get_sb()
служит для считывания суперблока с диска и заполнения объекта суперблока соответствующими данными при монтировании файловой системы. Остальные параметры описывают свойства файловой системы.
Для каждого типа файловой системы существует только одна структура file_system_type
, независимо от того, сколько таких файловых систем смонтировано и смонтирован ли хотя бы один экземпляр соответствующей файловой системы.
Значительно интереснее становится, когда файловая система монтируется, при этом создается структура vfsmount
. Эта структура используется для представления конкретного экземпляра файловой системы, или, другими словами, точки монтирования.
Структура vfsmount
определена в файле следующим образом.
struct vfsmount {
struct list_head mnt_hash; /* список хеш-таблицы */
struct vfsmount *mnt_parent; /* родительская файловая система */
struct dentry *mnt_mountpoint; /* объект элемента каталога
точки монтирования */
struct dentry *mnt_root; /* объект элемента каталога корня
данной файловой системы */
struct super_block *mnt_sb; /* суперблок данной файловой системы */
struct list_head mnt_mounts; /* список файловых систем,
смонтированных к данной */
struct list_head mnt_child; /* потомки, связанные с родителем */
atomic_t mnt_count; /* счетчик использования */
int mnt_flags; /* флаги монтирования */
char *mnt_devname; /* имя смонтированного устройства */
struct list_head mnt_list; /* список дескрипторов */
struct list_head mnt_fslinkk; /* истекший список, специфичный
для файловой системы */
struct namespace *mnt_namespace; /* связанное пространство имен */
};
Самая сложная задача — это поддержание списка всех точек монтирования и взаимоотношений между данной файловой системой и другими точками монтирования. Эта информация хранится в различных связанных списках структуры vfsmount
.
Структура vfsmount
также содержит поле mnt_flags
. В табл. 12.1 приведен список стандартных флагов монтирования.
Таблица 12.1. Список стандартных флагов монтирования
Флаг | Описание |
---|---|
MNT_NOSUID |
Запрещает использование флагов setuid и setgid для бинарных файлов на файловой системе |
MNT_NODEV |
Запрещает доступ к файлам устройств на файловой системе |
MNT_NOEXEC |
Запрещает выполнение программ на файловой системе |
Эти флаги полезны, в основном, для сменных носителей, которым администратор не доверяет.
Структуры данных, связанные с процессом
Каждый процесс в системе имеет свои открытые файлы, корневую файловую систем); текущий рабочий каталог, точки монтирования и т.д. Следующие три структуры данных связывают вместе подсистему VFS и процессы, которые выполняются в системе. Это структуры files_struct
, fs_struct
и namespace
.
Структура files_struct
определена в файле . Адрес этой структуры хранится в поле files дескриптора процесса. В данной структуре хранится вся информация процесса об открытых файлах и файловых дескрипторах. Эта структура, с комментариями, имеет следующий вид.
struct files_struct {
atomic_t count; /* счетчик ссылок на данную структуру */
spinlock_t file_lock; /* блокировка для защиты данной структуры */
int max_fds; /* максимальное количество файловых объектов */
int max_fdset; /* максимальное количество
файловых дескрипторов */
int next_fd; /* номер следующего файлового дескриптора */
struct file **fd; /* массив всех файловых объектов */
fd_set *close on exec; /* файловые дескрипторы, которые должны
закрываться при вызове exec() */
fd_set *open_fds; /* указатель на дескрипторы открытых файлов */
fd_set close_on_exec init; /* первоначальные файлы для закрытия
при вызове exec() */
fd_set open_fds_init; /* первоначальный набор
файловых дескрипторов */
struct file *fd_array[NR_OPEN_DEFAULT]; /* массив файловых объектов */
};
Массив fd
указывает на список открытых файловых объектов. По умолчанию это массив fd_array
. Так как по умолчанию значение константы NR_OPEN_DEFAULT
равно 32, то это соответствует 32 файловым объектам. Если процесс открывает больше 32 файловых объектов, то ядро выделяет новый массив и присваивает полю fd
указатель на него. При таком подходе доступ к небольшому количеству файловых объектов осуществляется быстро, потому что они хранятся в статическом массиве. В случае, когда процесс открывает аномально большое количество файлов, ядро может создать новый массив. Если большинство процессов в системе открывает больше 32 файлов, то для получения оптимальной производительности администратор может увеличить значение константы NR_OPEN_DEFAULT
с помощью директивы препроцессора. Следующая структура данных, связанная с процессом, — это структура fs_struct
, которая содержит информацию, связанную с процессом, и на которую указывает поле fs
дескриптора процесса. Эта структура определена в файле и имеет следующий вид с поясняющими комментариями.
struct fs_struct {
atomic_t count; /* счетчик ссылок на структуру */
rwlock_t lock; /* блокировка для защиты структуры */
int umask; /* права доступа к файлу, используемые
по умолчанию */
struct dentry *root; /* объект dentry корневого каталога */
struct dentry *pwd; /* объект dentry
текущего рабочего каталога */
struct dentry *allroot; /* объект dentry альтернативного корня */
struct vfsmount *rootmnt; /* объект монтирования корневого каталога */
struct vfsmount *pwdmnt; /* объект монтирования
текущего рабочего каталога */
struct vfsmount *altrootmnt; /* объект монтирования
альтернативного корня */
};
Эта структура содержит текущий рабочий каталог и корневой каталог данного процесса.
Третья, и последняя, структура — это структура namespace
, которая определена в файле и на экземпляр которой указывает поле namespace
дескриптора процесса. Пространства имен, индивидуальные для каждого процесса, были введены в ядрах Linux серии 2.4. Это позволило создать для каждого процесса уникальное представление о смонтированных файловых системах. Иными словами, процесс может иметь не только уникальный корневой каталог, но и полностью уникальную иерархию смонтированных файловых систем, если это необходимо. Как обычно, ниже приведена соответствующая структура данных с комментариями.
Интервал:
Закладка: