Предотвращение невыровненного доступа на уровне набора команд - PullRequest
0 голосов
/ 28 октября 2019

Существуют ли наборы инструкций, в которых доступы без выравнивания предотвращаются с помощью небайтовых адресов?

Насколько я знаю, большинство архитектур везде используют байтовые адреса, но штрафуют или генерируют исключения для невыровненных обращений.

Не имеет ли смысла предотвращать это на уровне команд, например, bstr для хранения байтов использует адреса байтов, dstr хранит слова, используя адреса слов, qstr хранит квадраты, используя адреса квадрантов и т. Д.? Таким образом, нет исключений и штрафов, и в качестве бонуса он может даже увеличить диапазон доступного пространства памяти (иначе младшие биты будут потрачены впустую).

Из того, что я мог найти о x86, ARM, Alpha, Itanium и т. Д.,они всегда используют байтовую адресацию, но требуют от пользователя обеспечить, чтобы некоторые инструкции использовались только с выровненными адресами, что приводит к исключению / штрафу во время выполнения, вместо того, чтобы «статически» избегать его, используя адреса, совместимые с рассматриваемыми типами.

Я что-то пропустил? Или есть серьезная причина предпочесть его таким образом (например, упростить компиляторы)?

1 Ответ

2 голосов
/ 28 октября 2019

вместо того, чтобы «статически» избегать его, используя адреса, совместимые с рассматриваемыми типами.

Статически (во время компиляции) очень легко избежать когда-либо делать указатель с несмещение нескольких из 4 int*. Компиляторам не сложно с этим;в C вам придется привести к uintptr_t и обратно или выполнить другие трюки, чтобы выровнять int*.

Проверка выровненных адресов в HW очень дешевая (просто убедитесь, чтомладшие 3 бита равны нулю). Потенциальный сбой также дешев, если вам нужно только ускорить быстрый путь. Загрузка / хранение уже должны быть в состоянии вызвать сбой страницы для виртуальной памяти в любом случае.

Это не реальная проблема, требующая решения

only обратная сторона байта- адресная память с необходимыми для выравнивания нагрузками / хранилищами тратит эти младшие биты адреса. (Или, конечно, неэффективность, если у вас возникла проблема, когда было бы полезно выровнять нагрузки или хранилища, тогда невозможность их выполнить - это проблема, независимо от причины.)

В реальной жизни да, иногда мы имеемменьше выравнивания, чем хотелось бы, и обнаружение случаев, когда ваша программа работает медленно из-за этого, может быть полезным. У нас есть счетчики производительности для этого на современной x86. (И даже флаг проверки выравнивания, но он почти непригоден, потому что стандартные библиотеки и компиляторы предполагают, что он не установлен.)


Существует несколько машин с адресацией по словам, включая некоторые современные DSP. Но у них все еще есть только одна «шкала» для адресов, ни одна часть адресного пространства не может быть байтово-адресуемой.

Или есть серьезная причина предпочесть его таким образом (например, упрощающие компиляторы)?

Да, есть. Если вы хотите эффективно обнулить массив перед использованием его для массива bool или строки char, то обнуление может произойти с 8-байтовыми или даже более широкими хранилищами SIMD. Используя тот же адрес , который вы будете использовать для доступа байтов к тем же данным . Это только один пример.

Нередко хочется использовать более широкую загрузку или хранилище для копирования вокруг нескольких элементов struct. Говоря о том, как будет работать структура? Обычно у вас есть один адрес для базы структуры и вы можете получить доступ к любому члену с фиксированными смещениями. С вашей схемой, вам нужно будет сместить адрес вправо, чтобы отменить неявное смещение влево qld?


Кроме того, распределитель памяти, такой как malloc, может использовать один и тот же адрес независимо от того, каквызывающая сторона хочет использовать память. Нужно ли масштабировать адрес (смещая) обратно до некоторого стандартного масштаба до free, да?

Наличие нескольких адресов для одних и тех же ячеек памяти является "псевдонимом" и, как правило, вызывает проблемы.

Или вы представляете, что байтовое адресное пространство полностью не пересекается с адресным пространством qword? Если да, то как вы можете эффективно копировать данные с одного на другое, не имея возможности хранить более 1 байта за раз? Может быть, с SIMD-загрузками / хранилищами, доступными для каждого адресного пространства?

Или это 4 ГБ памяти, адресуемые байтами (а также слова, слова и слова), и выше 4–8 ГБдиапазон адресован только как 16-битные или более широкие фрагменты? И следующие 8GiB выше, которые можно использовать только как 32-битные блоки? (Верхняя половина диапазона адресов dstr). и т. д.

Если это так, у вас есть отдельный распределитель malloc для каждого размера, поэтому, если вам нужна память, к которой можно обращаться в байтах, она ограничена низкими 4 ГБ (32-битными bstr адресами)= младшие 29 бит 32-битного qstr адресного пространства?) Потому что у вас есть память, которая недоступна для использования в качестве байтов. Адресное пространство qstr можно представить как неявное смещение влево на 3, чтобы создать 35-битный адрес байта, выровненный на 8 байтов.

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

Я думаю, виртуальная память все еще будет работать в терминах физических страниц фиксированного размера, а ОС может поддерживать любые виртуальныестраница в эффективно 35-битном виртуальном адресном пространстве с одной из этих страниц 4k. Но это означает, что граница страницы для qstr составляет всего 4096/8 = 512 больших адресов qword.

(Я предполагаю, что ширина регистра в этих примерах составляет 32 бита. Если у вас есть 64-битные регистры, вы неВам не нужны неудобные приемы для расширения адресного пространства, вы можете просто использовать байтовые адреса.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...