Исполнение и загрузка пользовательских программ в 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 ); для них ядро поддерживает стандартный интерфейс.