Обзор архитектуры и возможностей системы Linux: управление памятью, ресурсами, файловые системы, драйверы устройств, сети, безопасность
Исполнение и загрузка пользовательских программ в Linux
Linux поддерживает таблицу функций для загрузки программ. Каждой функции предоставляется возможность попытаться загрузить заданный файл, когда выполняется системный вызов exec.
Регистрация многократно загружаемых программ позволяет Linux поддерживать как ELF-,так и a.out – форматы кода.
Первоначально страницы двоичного файла загружаются в виртуальную память; только если программа пытается обратиться к данной странице и возникает отказ страницы, в результате данная страница загружается в физическую память.
Двоичный файл формата ELF (Executable and Linkage Format) состоит из заголовка, за которым следуют несколько выравненных до страницы секций ; ELF-загрузчик читает заголовок и отображает секции файла в отдельные регионы виртуальной памяти.
Структура секций файла ELF для модуля ядра Linux показана в таблица 1.
Распределение памяти для ELF-программ в Linux изображено на рис. 26.2.
Статическая и динамическая линковка.Программа, библиотечные функции которой встроены непосредственно в двоичный исполняемый код, статически линкуется со своими библиотеками.
Основной недостаток статической линковки в том, что любая генерируемая программа должна хранить копии одних и тех же общесистемных библиотечных функций.
Динамическая линковка более эффективна в терминах как использования физической, так и дисковой памяти, так как она загружает системные библиотеки в память только один раз.
Системы файлов Linux
С точки зрения пользователя файловая система Linux представляет собой иерархическое дерево директорий, подчиняющееся семантике UNIX.
С внутренней точки зрения, ядро скрывает детали реализации и управляет многими различными файловыми системами через общий уровень абстракции, то есть виртуальную файловую систему (VFS).
Linux VFS спроектирована по объектно-ориентированным принципам и использует набор определений, задающий структуру файлов. Системные структуры inode-object и file-object представляют отдельные файлы. Объект file system object представляет файловую систему в целом. Существует уровень абстракции для манипулирования этими объектами.
Файловая система Ext2fs – основная файловая система Linux. Она использует механизм, сходный с UNIX BSD Fast File System (ffs) для поиска блоков данных, принадлежащих некоторому файлу.
Основные различия между ext2fs и ffs касаются их политик распределения дисковой памяти.
В системе ffs диск делится на файлы, состоящие из блоков по 8Kb, а блоки разбиваются на фрагменты по 1Kb для хранения маленьких файлов или частично заполненных блоков в конце файла.
Система Ext2fs не использует фрагменты; она распределяет память более мелкими единицами. Размер блока по умолчанию в ext2fs -1Kb, хотя блоки в 2Kb и 4Kb также поддерживаются.
Система Ext2fs использует политики распределения, спроектированные с целью размещения логически смежных блоков файла в физически смежных блоках на диске, так чтобы можно было использовать одну операцию ввода-вывода для нескольких смежных блоков.
Структурная схема системы файлов Ext2fs показана в таблица 2.
Группы блоков в Ext2fs.Все блоки ext2fs разделяются на группы блоков. Для каждой группы блоков создается отдельная запись в глобальной дескрипторной таблице, в этой записи хранятся основные параметры:
- номер блока битовый карты блоков
- номер блока битовой карты inode
- номер блока таблицы inode
- число свободных блоков в группе
- число inode, содержащих каталоги.
Битовая карта блоков — это структура, каждый бит которой показывает, отведён ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Аналогичную функцию выполняет битовая карта индексных дескрипторов, показывая какие именно индексные дескрипторы заняты, а какие нет. Ядро Linux, используя число inode, содержащих каталоги, пытается равномерно распределить inode каталогов по группам, а inode файлов помещает, если это возможно, в группу с родительским каталогом.
Все оставшееся место, обозначенное в таблице как данные, отводится для хранения файлов.
Адресация файлов в Ext2fs.Система адресации данных — одна из самых существенных составных частей файловой системы. Именно система адресации позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске.
Файловая система ext2 использует следующую схему адресации блоков файла. Для хранения адреса файла выделено 15 полей, каждое из которых состоит из 4 байтов.
Если размер файла меньше или равен 12 блокам, то номера этих кластеров непосредственно перечисляются в первых двенадцати полях адреса. Если размер файла превышает 12 блоков, то следующее 13-е поле содержит адрес кластера, в котором могут быть расположены номера следующих блоков файла.
Таким образом, 13-й элемент адреса используется для косвенной адресации. При максимальном размере блока, равном 4096 байтов, 13-й элемент может содержать до 1024 номеров следующих кластеров данных файла. Если размер файла превышает 12+1024 блоков, то используется 14-е поле, в котором находится номер блока, содержащего 1024 номеров блоков, каждый из которых хранит 1024 номеров блоков данных файла. Здесь применяется уже двойная косвенная адресация. И, наконец, если файл включает более 12+1024+1048576 = 1049612 блоков, то используется последнее 15-е поле для тройной косвенной адресации.
Таким образом, описанная выше система адресации, позволяет при максимальном размере блока 4 Кб иметь файлы размера до 2 терабайт или больше.
Схема адресации файлов в системе Ext2fs изображена на рис. 26.3.
Принципы размещения блоков в системе Ext2fs иллюстрируются на рис. 26.4.
Файловая система Linux Proc.Файловая система proc не хранит данные; вместо этого, их содержимое вычисляется по требованию, в соответствии с пользовательскими запросами на ввод-вывод.
Система proc реализует структуру директорий и файлы, находящиеся внутри них; затем она определяет уникальный и сохраняемый номер inode для каждой директории и файлов, которые в ней содержатся. Она использует этот номер inode для идентификации, какая операция требуется, когда пользователь пытается обратиться к конкретному inode файла или выполнить поиск в конкретном inode директории.
Когда данные читаются из одного из этих файлов, система proc собирает соответствующую информацию, преобразует ее в текстовую форму и помещает в буфер чтения соответствующего процесса.