10.2.2 Позиционно независимый код (PIC) |
Предыдущая Содержание Следующая |
В этом случае компилятор создаёт позиционно независимый код с помощью программного счётчика - относительно текстовых адресов. (* Например, вызов функции будет использовать “call 0x500”, означающий вызов функции, расположенный по адресу PC+0x500 или “jmp 0x20”, означающий переход по адресу PC+0x20.) Относительная адресация требует аппаратной поддержки, инструкций, которые способны интерпретировать адресацию относительно PC (Program Counter, счётчик команд, программный счётчик). Все данные адресуются с помощью таблицы, называемой глобальной таблицей смещений (Global Offset Table, GOT). GOT помещается в начало сегмента данных и содержит указатели адресов данных, используемых в коде. На некоторых архитектурах, таких как m68k, размер GOT ограничен.
Выполнение на месте (eXecute In Place, XIP)
Режим PIC также подходит для реализации выполнения на месте (eXecute-In-Place, XIP). В отличие от случая смены адресов, когда текст и данные необходимо перед исполнением скопировать в память (для модификации адресов переходов и вызовов), в двоичных файлов на основе PIC ничего исправлять не нужно. Программа может начать выполнение сразу, как только был настроен сегмент данных. (* Заметим, что для этого сегменты данных и текста должны быть разделены с помощью соответствующих аргументов компилятора.) XIP использует это свойство и работает с текстом непосредственно на флеш/ПЗУ, на месте. Несколько экземпляров программы просто создают новые сегменты данных, а текстовый сегмент фактически является общим для всех экземпляров. В Таблице 10.1 приведены различия между FRB и PIC.
Table 10.1 Сравнение FRB и PIC
| ||||||||||
Предыдущая Содержание Следующая |