32-разрядные указатели с ISA x86-64: почему бы и нет?

Набор инструкций x86-64 добавляет больше регистров и других улучшений, чтобы упростить выполнение исполняемого кода. Однако во многих приложениях увеличенный размер указателя является бременем. Дополнительные неиспользуемые байты в каждом указателе забивают кеш и могут даже переполнять ОЗУ. GCC, например, строит флаг -m32, и я предполагаю, что это причина.

Можно загрузить 32-битное значение и обработать его как указатель. Это не требует дополнительных инструкций, просто загрузите/вычислите 32 бита и загрузите их из результирующего адреса. Однако трюк не будет переносимым, поскольку платформы имеют разные карты памяти. В Mac OS X зарезервировано всего 4 ГБ адресного пространства. Тем не менее, для одной из программ, которые я написал, хакерство добавляя 0x100000000L к 32-разрядным "адресам", прежде чем использовать улучшенную производительность по сравнению с истинными 64-разрядными адресами или компиляцию с помощью -m32.

Есть ли какое-либо фундаментальное препятствие для 32-разрядной платформы x86-64? Я полагаю, что поддержка такой химеры добавила бы сложности в любую операционную систему, и всем, кто хочет, чтобы последние 20% должны были просто сделать это Work ™, но все же кажется, что это было бы лучше всего подходит для множества интенсивных вычислительных программ.

Ответ 1

В разработке существует ABI, называемый "x32" для linux. Это сочетание между x86_64 и ia32, аналогичное тому, что вы описали, - 32-разрядное адресное пространство при использовании полного набора бит-бит. Для этого требуется собственное ядро, binutils и gcc.

Некоторые тесты SPEC показывают улучшение производительности около 30% в некоторых тестах. Дополнительную информацию см. https://sites.google.com/site/x32abi/

Ответ 2

Я не ожидаю, что очень сложно поддерживать такую ​​модель в ОС. Единственное, что нужно изменить для процессов в этой модели, - это управление страницами, страницы должны быть выделены ниже точки 4 ГБ. Ядро также должно выделять свои буферы из первых 4 ГБ виртуального адресного пространства, если оно передает их в приложение. То же самое относится к загрузчику, который загружает и запускает приложения. Кроме того, 64-битное ядро ​​должно иметь возможность обрабатывать такие приложения без существенных изменений.

Поддержка компилятора также не должна быть большой проблемой. Это в основном вопрос создания кода, который может использовать дополнительные регистры процессора и их полные 64 бита и при необходимости добавлять соответствующие префиксы REX.

Ответ 3

Он называется "эмуляция x86-32" или WOW64 в Windows (предположительно, что-то еще на других операционных системах), и это флаг оборудования в процессоре. Нет необходимости в каких-либо трюках пользовательского режима.