Позиционно-независимый код

3-ий метод – это относительная адресация, когда адресок выходит сложением адресного поля команды и адреса самой этой команды – значения счетчика команд. Код, в каком употребляется только такая адресация, можно загружать с хоть какого адреса без всякой перенастройки. Таковой код именуется позиционно-независшлым (position-independent). Позиционно-независимые программки очень комфортны для загрузки, но, к Позиционно-независимый код огорчению, при их написании следует соблюдать достаточно жесткие ограничения, накладываемые на применяемые в программке способы адресации. К примеру, нельзя воспользоваться статически инициализованными переменными указательного типа. Появляются трудности при сборке программки из нескольких модулей. К тому же, на многих микропроцессорах, к примеру, на Intel 8080/8085 либо многих современных Позиционно-независимый код RISC-процессорах, описанная выше реализация позиционно-независимого кода вообщем невозможна, потому что эти микропроцессоры не поддерживают соответственный режим адресации для данных. На микропроцессорах гарвардской архитектуры адресовать данные относительно счетчика команд вообщем нереально – команды находятся в другом адресном пространстве. Потому таковой стиль программирования употребляют исключительно в особенных случаях.

Оверлеи (перекрытия)

Еще больше увлекательный Позиционно-независимый код метод загрузки программки — это оверлейная загрузка (over-lay, лежащий сверху) либо, как это называли в старенькой русской литературе, перекрытие. Смысл оверлея заключается в том, чтоб не загружать программку в память полностью, а разбить ее на несколько модулей и помещать их в память при необходимости. При всем этом Позиционно-независимый код на одни и те же адреса в разные моменты времени будут отображены различные модули. Отсюда и заглавие. Потребность в таком методе загрузки возникает, если у нас виртуальное адресное место не много, к примеру 1 Мбайт либо даже всего 64 Кбайт, а программка относительно велика. На современных 32-разрядных системах виртуальное адресное Позиционно-независимый код место обычно измеряется гб, и большинству программ этого хватает. Основная неувязка при оверлейной загрузке состоит в последующем: до того как ссылаться на оверлейный адресок, мы должны осознать, какой, из оверлейных модулей на этот момент там находится. Для ссылок на функции это просто: заместо точки входа функции мы вызываем некоторую Позиционно-независимый код функцию, именуемую менеджером перекрытий (overlay manager). Эта процедура знает, какой модуль куда загружен, и по мере надобности “подкачивает” то, что загружено не было. Перед каждой ссылкой на оверлейные данные мы должны делать аналогичную функцию, что намного наращивает и замедляет программку. Время от времени такие деяния возлагаются на программера (Win 16, Mac Позиционно-независимый код OS до версии 10), время от времени – на компилятор (handle pointer в Zortech C/C++ для MS DOS), но в большинстве случаев с оверлейными данными вообщем предпочитают не иметь дела. В таком случае оверлейным является только код.

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

Каждый оверлейный модуль может быть как абсолютным, так и перемещаемым. От этого несколько изменяется устройство менеджера, но менее того.

Сборка Позиционно-независимый код программ

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

В большинстве современных языков программирования программка состоит из отдельных почти не связанных модулей. Обычно, каждому такому модулю соответствует отдельный файл Позиционно-независимый код начального текста. Эти файлы независимо обрабатываются языковым микропроцессором (компилятором), и для каждого из их генерируется отдельный файл, именуемый объектным модулем. Потом запускается программка, именуемая редактором связей, компоновщиком либо линкером (linker — тот, кто связывает), которая сформировывает из данных объектных модулей цельную программку. Общая структура процесса сборки представлена на рисунке.

Объектный модуль частично похож Позиционно-независимый код по структуре на перемещаемый загрузочный модуль. Дело в том, что сборку программки из нескольких модулей можно уподобить загрузке в память нескольких программ. При всем этом появляется та же задачка перенастройки адресных ссылок, что и при загрузке относительного загрузочного файла. Потому объектный модуль должен в той либо Позиционно-независимый код другой форме содержать таблицу перемещений. Можно, естественно, востребовать, чтоб весь модуль был позиционно-независимым, но это накладывает очень жесткие ограничения на стиль программирования, а на многих микропроцессорах просто нереально.

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


pozharoopasnost-v-lesah-eao-znachitelno-snizilas-informacionnoe-agentstvo-primamedia-13062011.html
pozharov-mi-26t-s-kompleksom-protivopozhar-rossijskie-smi-o-mchs-monitoring-za-24-avgusta-2010-g.html
pozharov-rasprostranivshihsya-s-territorii-kazahstana-vveden-rezhim-chrezvichajnoj-situacii.html