Распределение сегментов в пределах банка памяти — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Распределение сегментов в пределах банка памяти

2022-10-05 18
Распределение сегментов в пределах банка памяти 0.00 из 5.00 0 оценок
Заказать работу

Существует несколько вариантов распределения сегментов в пределах банка памяти:

· распределение сегментов заданных размеров. В этом случае редактор связей располагает сегменты в порядке их следования, приведенном в файле конфигурации. Сегменты ложатся один за другим с учетом констант выравнивания, заданных для каждого сегмента. Если места в банке окажется недостаточно, редактор связей выдаст соответствующую ошибку. Реальные адреса сегментов будут вычислены после того, как процесс размещения будет окончен,

· распределение сегментов, когда один из них имеет заранее определенный адрес и размер. Если этот сегмент не первый в списке, то банк разбивается на две части. В первую часть добавляются сегменты в порядке, определенном в файле конфигурации. Сегмент с определенным адресом пропускается. Если для очередного сегмента не хватает места, он помещается после сегмента с определенным адресом. Образовавшееся свободное пространство остается незаполненным,

· распределение сегментов, когда один из них имеет плавающий размер. Независимо ни от чего, сначала в банке размещаются все сегменты, размеры которых определяются только секциями, описанными в файле конфигурации. Далее в сегменты добавляются загружаемые секции, не упомянутые в файле конфигурации. Если первым в списке стоит сегмент с плавающим размером, то все эти секции добавляются в него. При этом осуществляется проверка на превышение размеров банка памяти. Если первым стоит сегмент заданного размера, то в него добавляются секции, пока его реальный не превысит заданного порога. Тогда остальные секции будут добавляться в следующие сегменты по той же схеме,

· распределение сегментов, когда два из них имеют плавающий размер. Ситуация почти не отличается от предыдущего пункта. Все дополнительные секции будут добавлены в первый сегмент плавающего размера, поэтому наличие плавающего размера у второго сегмента роли не играет, он реально ничем не будет отличаться от сегментов с ограниченным максимальным размером,

· распределение сегментов, когда сегмент с плавающим размером располагается перед сегментом с определенным адресом. В этом случае первый сегмент может увеличиваться до определенной границы, то есть его размер ограничивается адресным пространством от начала банка, до начала сегмента с определенным адресом. Дальнейший механизм добавления секций остается без изменений.

Секция SECTIONS

В SECTIONS содержится описание загружаемых секций, входящих в состав объектного файла. Каждая секция может иметь следующие атрибуты:

Имя - имя секции. Для задания имени могут использоваться символы: A-Z, a-z, _. Не допускаются пробелы внутри имен. Как и в языке ассемблера, имя секции не должно предваряться точкой, то есть имена секций в ассемблере и в файле конфигурации совпадают.
Align page - выравнивание по началу страницы памяти. Это означает, что секция должна начинаться с адреса, кратного размеру страницы памяти данного банка, с который она попадает (по умолчанию все загружаемые секции выравниваются по границе 64-х разрядного слова).
executable - содержит исполняемый код. Этот флаг принудительно устанавливается для секций.text***,.init***,.fini***, tss
writable - содержит перезаписываемые данные. Этот флаг принудительно устанавливается для секций.data***,.bss***,.common***,.stack***,.heap***,

 

Секция всегда входит в состав того или иного сегмента (речь идет только об абсолютных исполняемых файлах). Если несколько секций принадлежат одному и тому же сегменту, то они размещаются в порядке, определенном в файле конфигурации. Секции, не упомянутые в файле конфигурации, но являющиеся загружаемыми также добавляются в сегменты по правилам, описанным в подпункте 4.11.2.1.

Задание абсолютного адреса секции вручную: at 0x80000000; адрес, начиная с которого размещается описываемая секция. В этом случае для данной секции заводится собственный сегмент с определенным адресом и размером, равным размеру секции.

Приведем пример секции SECTIONS:

SECTIONS /* Размещение секций по сегментам */

{

text in name2;

data in name1;

text1 in name1, align page;

nobits in name2, align page;

heap at 0x10020000;

stack at 0x00010000;

}

Последовательность секций в сегменте определяется несколькими факторами:

· общий порядок размещения секций в сегменте, когда сначала располагаются секции инициализированных, а затем неинициализированных данных,

· сначала в сегменте расположены секции, приведенные в файле конфигурации, а затем остальные с флагом загрузки.

Следующий пример показывает, как редактор связей расположит секции в сегменте.

· объектный файл содержит следующие загружаемые секции:

textProc;  (секция инициализированных данных)

bss.dataVector; (секция не инициализированных данных)

dataVector; (секция инициализированных данных)

textMain;  (секция инициализированных данных)

dataProc;  (секция инициализированных данных)

bss.dataProc; (секция не инициализированных данных)

textProc1; (секция инициализированных данных)

· файл конфигурации задает расположение некоторых из них в сегменте VECTORS:

SECTIONS

{

dataVector in VECTORS;

bss.dataVector in VECTORS;

textMain  in VECTORS, align page;

textProc1 in VECTORS;

}

· реальное расположение секций в сегменте, установленное редактором связей:

// секции инициализированных данных.

dataVector; // из файла конфигурации.

textProc; // не отмеченная в файле конфигурации.

textMain; // из файла конфигурации.

textProc1; // из файла конфигурации.

dataProc; // не отмеченная в файле конфигурации.

// секции неинициализированных данных.

bss.dataVector; // из файла конфигурации.

bss.dataProc1; // не отмеченная в файле конфигурации.

Однако реальный порядок секций в сегменте может быть отличным от приведенного выше. А повлиять на него способно выравнивание секций по границе страницы памяти. Например, если в результате выравнивания секций, между секциями dataVector и textMain образуется неиспользуемый участок памяти, то редактор связей может поместить в него одну из секций, не упомянутых в файле конфигурации. Это зависит от размера вставляемой секции и от требования по ее выравниванию в памяти. Если секция textProc с учетом выравнивания имеет размер меньший размера неиспользуемого участка, то окончательное расположение секций в сегменте будет следующим:

// секции инициализированных данных.

dataVector; // из файла конфигурации.

textProc; // не отмеченная в файле конфигурации.

textMain; // из файла конфигурации.

textProc1; // из файла конфигурации.

dataProc; // не отмеченная в файле конфигурации.


Поделиться с друзьями:

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.014 с.