Лекция 1 - Среда исполнения. Среда исполнения введение
Скачать 155.5 Kb.
|
Виртуальное адресное пространствоДиапазон адресов, который доступен процессу, называется виртуальным адресным пространством. Поскольку каждый процесс имеет свою таблицу трансляции виртуальных адресов в физические, говорят, что процесс имеет своё адресное пространство. Теоретически, максимальный объем адресного пространства ограничен длиной виртуального адреса и на 32-битных машинах составляет 4Гб. На практике, некоторые адреса зарезервированы системой для различных целей. Например, на процессорах x86/x64 ядро системы отображено в адреса пользовательского процесса. Это связано с особенностями диспетчера памяти x86, которые в нашем курсе детально не обсуждаются. На рисунках структуры адресного пространства эта область называется контекстом ядра (kernel context). Также, большинству программ не нужно 4Гб памяти. Система отводит процессу столько памяти, сколько запросила программа, а остальное адресное пространство защищает от доступа, например, устанавливая на соответствующие страницы защиту как от чтения, так и от записи. Виртуальная память пользователя для каждого процесса подразделяется на три обязательных сегмента: текст, данные и пользовательский стек. Когда программа загружается в память, информация из файла a.out используется для размещения и инициализации сегментов текста и данных. Кроме того, в современных системах, процесс обычно имеет динамические сегменты — сегменты кода и данных разделяемых библиотек, отображенные на память файлы, разделяемую память System V IPC и др. Редактор связей вводит переменные для пометки определенных частей программы (смотри END(3C)). Адрес etext указывает на конец текстового сегмента. Адреса edata и end указывают соответственно на конец инициализированной и не инициализированной области данных. Сегмент текста содержит команды, полученные из кода, написанного пользователем. Текст всегда загружается по одному и тому же виртуальному адресу. Это виртуальный адрес зависит от типа машины и от параметров, указанных редактору связей. Если два процесса исполняют одну и ту же программу с разделяемым сегментом текста, то только одна копия программы загружается в память. Таблицы трансляции всех процессов, использующих эту программу, настраиваются так, чобы указывать на эту память. Всякий раз когда программа с разделяемым текстом загружается с память, производится просмотр таблицы сегментов кода чтобы выяснить, не используется ли уже текст этой программы. Если используется, тогда новый процесс будет разделять уже загруженный программный текст. За сегментом текста следует сегмент данных, содержащий статические и внешние переменные. Секция неинициализированных данных содержит неинициализированные статические и внешние переменные и очищается при загрузке процесса. Стек пользователя используется для сохранения активационных записей (activation records), содержащих локальные переменные, аргументы вызовов функций, значения регистров, возвращаемые значения функций и другую информацию. Код, создающий и уничтожающий эти записи, генерируется компилятором и вставляется в начало и конец каждой функции языка C. При каждом вызове функции запись активации размещается я в стеке. При возвращении из функции запись активации освобождается. Место расположения стека и направление его роста машинно-зависимы. Попытка обращения к памяти между окончанием сегмента данных и вершиной стека приводит к ошибке обращения к памяти. Порядок расположения секций, расстояние между секциями и направление роста стека зависят от центрального процессора (ЦП) и версии ОС. На следующих слайдах приведены структуры адресного пространства Solaris для x86 и x64. Пользовательская область (user area)Операционная система сохраняет информацию о процессах в структурах данных, размещаемых в памяти ядра: в дескрипторах процесса и пользовательских областях (user area). На каждый процесс заводится только одна пользовательская область. Пользовательская область — это системный сегмент данных небольшого фиксированного размера, который содержит информацию, необходимую при исполнении этого процесса, например дескрипторы открытых файлов, реакцию на сигналы, информация о системных ресурсах. Пользовательская область, несмотря на название, не является непосредственно доступной для пользователя, так как она находится в памяти ядра. Даже если ядро отображено в адресное пространство процесса, на соответствующих страницах памяти стоят атрибуты, делающие эти страницы доступными только в системном режиме. Для получения/установки информации, хранящейся в пользовательской области, должны использоваться системные вызовы. Кроме атрибутов процесса, пользовательская область содержит стек, которым ядро пользуется при выполнении системных вызовов. Функции ядра не могут размещать свои записи активации на пользовательском стеке, ведь тогда другая нить пользовательского процесса могла бы подменить параметры функций или адрес возврата и вмешаться в работу кода ядра. Если в рамках процесса исполняется несколько нитей, то пользовательская область должна содержать соответствующее количество стеков, чтобы каждая нить могла исполнять системные вызовы независимо от других. |