Почему функции загружаются по выровненным адресам в Linux x86 для исполняемых файлов elf? - PullRequest
3 голосов
/ 19 мая 2010

Я смотрел на исполняемые файлы Linux elf на x86, в основном используя IDA, но также и gdb.Одна вещь, которую я заметил, это то, что функции всегда загружаются по адресам, выровненным по словам?Кто-нибудь знает причину этого?Мне не известно о каких-либо требованиях к инструкциям x86 для запуска по согласованным адресам.И это не может быть связано с выравниванием страницы, потому что граница страницы все еще может быть где-то внутри функции.

Я был бы признателен за любые идеи.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 19 мая 2010

Вы правы, инструкции не нужно выравнивать. На процессорах x86 инструкции по сборке кодируются с использованием кодов переменной длины от 1 до не менее 15 байтов.

Но инструкции читаются из кэша, обычно выровненного на 64 байта, и некоторые части конвейера выполнения работают быстрее, когда код выровнен правильно: декодирование, циклы, прогноз ветвления и т. Д.

Лучший источник информации об этом - документы Агнера Фога: http://www.agner.org/optimize/

1 голос
/ 19 мая 2010

Для некоторых архитектур выравнивание данных диктует объем данных, который можно скопировать за одну операцию. Например, попытка скопировать 32 бита с адреса 0x4000 может занять одну 32-битную операцию перемещения, где копирование 32 бита из 0x4001 может занять 4 8-битную операцию перемещения. Кроме того, использование 32-битной инструкции перемещения по смещенному адресу может вызвать аппаратное исключение. Аппаратное исключение обрабатывается путем копирования 8 бит за раз, но медленнее, чем копирование с выровненного адреса.

Edit:

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

...