-
Notifications
You must be signed in to change notification settings - Fork 2
06 сем Лекция 2 22.03.
LyubaxaPro edited this page Jun 15, 2021
·
3 revisions
Комментарии к рисунку:
- (Standart kernel) System call interface - интерфейс системных вызовов.
- В этой абстракции отдельно представлен уровень VFS. VFS представляет здесь уровень абстракции, определяющий Posix API, которые освобождают пользователя от знаний подробностей работы каждой конкретной файловой системы.
- Системные вызовы (API) - open, read, write, close - работают одинаково, независимо от того, какая файловая система располагается ниже (FS0, FS1 и т.д.).
- GNU - проект 1984го года, используется для создания программ для открытых операционных систем. GNU - ОС с открытым микроядром.
- GCC - компилятор, один из инструментов для работы с открытым ядром.
- GCC - GNU Compiler Collection General Public License(?).
- Compiler Collection включает: C, C++, Objective C, Ada и т.д.
- GNU - рекурсивный акроним GNU's Not Unix.
Родными для Linux являются EXT (Extended File System), UFS (User File System), NFS (Network file system) файловые системы. NTFS (New technology file system) - файловая система, написанная под Windows.
В основе VFS (внутренней организации виртуальной файловой системы) находится 4 основные структуры:
- struct superblock
- struct dentry
- struct inode
- struct file
Все эти структуры связаны между собой, связи прослеживаются в самих структурах - определяются соответствующими полями каждой из этих структур.
Комментарии к рисунку:
- В системе существует так называемый "просто файл" - любая поименованная совокупность данных, которая находится на диске, которую мы можем увидеть в каталогах. Процесс использует файлы для того, чтобы прочитать или записать информацию. Для этого процесс должен открыть файл. В результате, для данного процесса создается файловый дескриптор в таблице открытых файлов процесса. Т.е. у каждого процесса есть собственная таблица файловых дескрипторов файлов, открытых процессом. В системе есть одна таблица открытых файлов - в ней находятся дескрипторы всех открытых файлов в системе.
- Доступ к файлу осуществляется по полному имени файла (несмотря на то что имя не идентификатор) - для этого struct dentry.
- Один и тот же файл может иметь несколько имен в разных директориях - это хардлинки.
- Идентификатором файла является номер inode'a, а дескриптором - struct inode.
- Есть два inode'a - ядреный и дисковый. Дисковый - содержит полную информацию о файле и информацию, которая позволяет адресовать каждый участок дискового пространства, в котором находится информация данного файла. Unix/Linux поддерживают очень большие файлы - для таких невозможно выделить непрерывное адресное пространство на диске -> файлы хранятся участками, необходимо хранить адреса каждого участка- все эти адреса хранятся в дисковом айноде.
- Любой файл принадлежит определённой файловой системе. Суперблок содержит общую информацию о файловой системе (метаданные). Говорят, что "суперблок является контейнером для метаданных высокого уровня, представляющих данных конкретную ФС.
- Суперблок это структура, которая существует на диске, причем для большей надежности в нескольких местах диска, а также в памяти. На диске суперблок предоставляет ядру инфу о конкретной файловой системе.
Т.к. для юникс важнейшей операцией является монтирование файловых систем, то суперблок содержит информацию о смонтирвоанных файловых системах.
Комментарии к рисунку:
- Смонтированная файловая система содержит один суперблок, который ее описывает.
- Важнейшая информация о файловой системе - информация о файлах, принадлежащих данной файловой системе. Файлы описываются в struct inode.
- Для того чтобы иметь возможность обращаться к файлам файловой системы, необходимо иметь соответствующую информацию - битовую карту ilist, таблицу inode'ов.
- Дисковый inode содержит информацию об адресе каждого блока, который содержит информацию данного файла.
- Есть 12 блоков прямой адресации, косвенная адресация, двойная косвенная адресация, тройная косвенная адресация.
struct superblock
{
struct list_head s_list; // обеспечивает организацию связного списка
dev_t s_dev; // информация об устройстве, на
// котором находится файловая система
unsigned char s_block_size_bits; // размер блока в битах
unsigned long s_block_size_size; // размер блока в байтах
loff_t s_maxbytes; // максимально возможный размер файла
struct file_system_types *s_type; // тип файловой системы (один тип)
const struct super_operations *s_op; // все операции, определенные на суперблоке
...
unsigned long s_flags; // флаги монтирования
...
unsigned long s_magic; // магическое число для доступа к суперблоку
struct dentry *s_root; // точка монтирования
...
int s_count; // счетчик ссылок на суперблок
struct list_head s_mounts; // список монтирований
struct block_device *s_bdev; // связанное блочное устройство
char s_id[32]; // символьное имя
...
fmode_t s_mode; // права доступа для монтирования
...
const struct dentry_operations *s_d_op; // в этом суперблоке операции над
// структурой dentry
...
struct list_head s_inodes; // список всех inode'ов
...
}
Комментарии:
- В системе существует связный список суперблоков.
- В системе имеется структура struct file_system_types, которая описывает тип файловой системы. У каждой файловой системы есть ровно один тип, но смонтированных файловых систем одного типа может быть много.
- Любая структура ядра содержит средства взаимоисключения - в каждой структуре есть семафоры/мьютексы для того, чтобы обеспечивать монопольный доступ к определенным полям структуры.
- Суперблок создается на диске и в ядре.
- struct vfsmount - описывает объект управления, который предоставляет информацию о смонтированных файловых системах.