Исполнение и загрузка пользовательских программ в Linux
Linux поддерживает таблицу функций для загрузки программ. Каждой функции предоставляется возможность попытаться загрузить заданный файл, когда выполняется системный вызов exec.
Регистрация многократно загружаемых программ позволяет Linux поддерживать как ELF-,так и a.out– форматы кода.
Первоначально страницы двоичного файла загружаются в виртуальную память; только если программа пытается обратиться к данной странице и возникает отказ страницы, в результате данная страница загружается в физическую память.
Двоичный файл формата ELF (Executable and Linkage Format)состоит из заголовка, за которым следуют несколько выравненных до страницы секций ; ELF-загрузчик читает заголовок и отображает секции файла в отдельные регионы виртуальной памяти.
Структура секций файла ELF для модуля ядра Linux показана в таблица 1.
Таблица 1. Структура секций файла ELF длямодуля ядра Linux | |
.text | инструкции |
.fixup | изменения времени исполнения |
.init.text | инструкции инициализации модуля |
exit.text | выходные инструкции модуля |
.rodata.etrl.l | строки только для чтения |
.modinfо | текст макросов модуля |
_versions | данные о версии модуля |
.data | инициализированные данные |
.bss | неинициализированные данные |
other |
Распределение памяти для ELF-программ в Linux изображено на рис.2.
Рис. 2.Распределение памяти для ELF-программ.
Статическая и динамическая линковка. Программа, библиотечные функции которой встроены непосредственно в двоичный исполняемый код, статически линкуется со своими библиотеками.
Основной недостаток статической линковки в том, что любая генерируемая программа должна хранить копии одних и тех же общесистемных библиотечных функций.
Динамическая линковка более эффективна в терминах как использования физической, так и дисковой памяти, так как она загружает системные библиотеки в память только один раз.
Системы файлов 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.
Таблица 2. Структурная схема системы файлов Ext2fs в Linux |
Суперблок (Superblock) |
Описание группы блоков (Group Descriptors) |
Битовая карта блоков (Block Bitmap) |
Битовая карта индексных дескрипторов (Inode Bitmap) |
Таблица индексных дескрипторов (Inode Table) |
Данные (Data) |
Группы блоков в 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 изображена на рис.3.
Рис. 3.Адресация файлов в системе Ext2fs.
Принципы размещения блоков в системе Ext2fs иллюстрируются на рис. 4.
Рис. 4.Принципы размещения блоков в системе Ext2fs.
Файловая система Linux Proc.Файловая система procне хранит данные; вместо этого, их содержимое вычисляется по требованию, в соответствии с пользовательскими запросами на ввод-вывод.
Система procреализует структуру директорий и файлы, находящиеся внутри них; затем она определяет уникальный и сохраняемый номер inodeдля каждой директории и файлов, которые в ней содержатся. Она использует этот номер inodeдля идентификации, какая операция требуется, когда пользователь пытается обратиться к конкретному inodeфайла или выполнить поиск в конкретном inodeдиректории.
Когда данные читаются из одного из этих файлов, система procсобирает соответствующую информацию, преобразует ее в текстовую форму и помещает в буфер чтения соответствующего процесса.
Ввод и вывод в Linux
Система файлов Linux, ориентированная на устройства, осуществляет доступ к дисковой памяти с помошью двух кэшей:
· Данные хранятся в кэше страниц, который объединен с системой виртуальной памяти;
· Метаданные хранятся в буферном кэше, причем каждый кэш индексируется блоком диска.
Linux разбивает устройства на три класса:
Блочные устройствадопускают произвольный доступ к полностью независимым блокам данных фиксированного размера.
Символьные устройствавключают большую часть всех других устройств; они не нуждаются в поддержке функциональности обычных файлов.
Сетевые устройствавзаимодействуют с сетевой системой ядра.
Модульная структура драйверов устройств в Linux изображена на рис. 5.
Рис. 5.Модульная структура драйверов устройств.
Блочные устройстваобеспечивают основной интерфейс ко всем дисковым устройствам в системе. Блочный буферный кэш служит для двух основных целей:
· Как буферный пул для активного ввода-вывода
· Как кэш для завершенного ввода-вывода.
Менеджер запросов управляет чтением и записью содержимого буферов с помощью драйвера блочного устройства.
Символьные устройства. Драйвер символьного устройства не поддерживает произвольный доступ к фиксированным блокам данных.
Драйвер символьного устройства регистрирует набор функций, реализующих разнообразные требуемые операции ввода-вывода.
Ядро не выполняет почти никакой предварительной обработки запроса на чтение или запись в файл символьного устройства, но просто передает данный запрос драйверу устройства.
Основное исключение из этого правила – это особый набор драйверов символьных устройств, которые реализуют доступ к терминальным устройствам( TTY ); для них ядро поддерживает стандартный интерфейс.