Динамическое выделение памяти (ключи –heap, -heap1, -heap2, -heap3) — КиберПедия 

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

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Динамическое выделение памяти (ключи –heap, -heap1, -heap2, -heap3)

2022-10-05 28
Динамическое выделение памяти (ключи –heap, -heap1, -heap2, -heap3) 0.00 из 5.00 0 оценок
Заказать работу

Компилятор Си++ использует секции неинициализированных данных.heap (локальная куча) и.heap1 (глобальная куча) для создания динамической кучи времени выполнения, используемой функцией malloc(). При помощи ключей -heap и -heap1 можно определить размер кучи в глобальной и локальной памяти вычислительного устройства. Величина кучи задается после знака "равно", и измеряется в 32-разрядных словах:

linker -heap= 0x40000 -heap1= 0x100000,

под локальную кучу выделено 256K слов, а под глобальную 1Mb слов.

Между ключами -heap и -heap1, знаком "=" и размером кучи не должно быть пробелов.

По умолчанию размеры локальной и глобальной куч равны 1K слов. Если размер кучи не установлен пользователем, редактор связей выдает напоминание, что под кучу выделено всего 1K слов. 

Редактор связей создает секции.heap и.heap1 только в том случае, если они имеются во входных файлах, в частности, в библиотеке работы с динамической памятью. Во всех других случаях данные ключи игнорируются.

Редактор связей создает также глобальные символы __HEAP_SIZE и __HEAP1_SIZE. Им присваиваются значения, равные размерам локальной и глобальной куч памяти времени выполнения.

О ключах – heap2 и – heap3

В связи с тем, что процессор может работать с четырьмя шинами и более, и соответственно, возможность работы с четырьмя областями памяти, возникает желание располагать данные более чем в двух областях. Для этого и была добавлена возможность создания еще двух куч. Размер их по умолчанию ноль, в остальном их свойства повторяют свойства первых двух куч. Размер их содержат переменные __HEAP2_SIZE и __HEAP3_SIZE. Для того, чтобы целенаправленно выделять память в нужной области можно использовать функции malloc0, malloc1, malloc2 и malloc3.

4.8.5 Определение размера стека (ключ -stack=[размер])

Для работы программ (на процессорах серии 1879ВМ), при осуществлении вызова функций, сохранения регистров и адресов возврата, используется стек. Стек представляет собой секцию неинициализированных данных с именем.stack, размер которой задается на этапе создания исполняемого файла, то есть во время редактирования связей. Размер стека задается при помощи параметра -stack=[размер] и измеряется в 32-разрядных словах.

Следующий пример демонстрирует процесс определения стека (секции.stack) размером 4K слов:

linker - stack= 0x1000

По умолчанию размер стека равен 1K слов.

Между ключом -stack, знаком "=" и размером стека не должно быть пробелов.

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

4.8.6 Определение имени точки входа (ключ -start=<имя_метки>)

Адрес памяти, с которого программа начинает выполняться, называется точкой входа. Когда загрузчик помещает программу в память вычислительного устройства, счетчик команд должен быть инициализирован, в него необходимо записать адрес начала программы.

По умолчанию, когда в командной строке не задано имя точки входа, редактор связей полагает, что она имеет имя start. Если глобальный символ с данным именем в таблице символов не обнаружен, или обнаружен, но не определен, то пользователю выдается ошибка " точка входа start не определена ".

Ключ -start=<имя_метки> позволяет задать свое имя метки, с которой будет запущена программа. Метка обязательно должна быть определена в одной из секций, и иметь глобальный тип связывания. Редактор связей вычисляет ее адрес и сохраняет его, как адрес точки входа.

Следующий пример демонстрирует процесс определения пользовательской точки входа, которая в программе помечена меткой BEGIN:

linker file1.elf file2.elf -start= BEGIN

Между ключом -start, знаком "=" и именем метки не должно быть пробела.

Обычно точка входа с именем start определена в стартовом коде, который хранится в библиотеке времени выполнения. При подсоединении данной библиотеки в процессе редактирования связей стартовый код автоматически добавляется к пользовательской программе.

 

Примечание Если использовать стандартную библиотеку, и при этом определить собственную точку входа, то стандартный стартовый код не будет использован, а при дополнительном задании ключа ‑d{1..4} можно и вовсе удалить его из исполняемого файла. Тогда пользователь берет на себя ответственность по правильной установке регистра стека ar7 при запуске программы, и по обработке возврата из программы.

 


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

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

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

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...



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

0.007 с.