У меня есть простая тестовая программа, которая загружает регистр xmm с инструкцией movdqu для доступа к данным через границу страницы (OS = Linux).
Если отображается следующая страница, это работает нормально. Если он не сопоставлен, я получаю SIGSEGV, что, вероятно, ожидаемо.
Однако это несколько снижает полезность невыровненных нагрузок. Кроме того, инструкции SSE4.2 (например, pcmpistri), которые позволяют использовать невыровненные ссылки на память, также демонстрируют это поведение.
Все в порядке - за исключением того, что я обнаружил множество реализаций strcmp с использованием pcmpistri, которые, похоже, вообще не решают эту проблему - и я смог придумать тривиальные тестовые сценарии, которые приведут к сбою этих реализаций, в то время как побайтная тривиальная реализация strcmp будет отлично работать с тем же макетом данных.
Еще одно замечание - похоже, что реализация библиотеки GNU C для 64-битной Linux имеет вариант __strcmp_sse42, который, по-видимому, использует инструкцию pcmpistri более безопасным образом. Реализация этого strcmp довольно сложна, но, похоже, она тщательно пытается избежать проблемы с границами страницы. Я не уверен, связано ли это с проблемой, которую я описал выше, или это просто побочный эффект попытки повысить производительность за счет выравнивания данных.
В любом случае, у меня в первую очередь вопрос - где я могу узнать больше об этой проблеме? Я ввел «movdqu, пересекающий границу страницы» и все варианты, которые я мог придумать для Google, но не нашел ничего особенно полезного. Если кто-нибудь может указать мне на дополнительную информацию по этому поводу, я был бы очень признателен.
__strcmp_sse42
, вероятно, делает это, чтобы избежать снижения производительности при пересечении границы страницы. Процессоры Intel (не уверен в последних версиях) всегда демонстрировали ужасающую производительность при несогласованном доступе, выходящем за границы страницы. Однако проблема с ошибкой страницы не должна иметь значения. - person Mysticial   schedule 12.02.2014strcmp
также сгенерируетSIGSEG
, если вы передадите незавершенную строку и позволите ей перейти на не отображенную страницу. Это как раз то, что делает доступ к несопоставленной странице. - person Damon   schedule 12.02.2014