我有一个简单的测试程序,它使用movdqu指令加载一个xmm寄存器,访问页面边界(OS = Linux)的数据.
如果映射了以下页面,这可以正常工作.如果它没有映射,那么我得到一个SIGSEGV,这可能是预期的.
然而,这会大大减少未对齐载荷的有用性.另外,允许未对齐的内存引用的SSE4.2指令(如pcmpistri)似乎也表现出这种行为.
这一切都很好 - 除了有很多使用pcmpistri的strcmp实现,我发现它似乎根本没有解决这个问题 - 而且我已经能够设计出导致这些实现失败的琐碎测试用例,而对于一次一个字节的简单strcmp实现将在相同的数据布局下正常工作.
还有一点需要注意 - 64位Linux的GNU C库实现似乎有一个__strcmp_sse42变体,它似乎以更安全的方式使用pcmpistri指令.这个strcmp的实现相当复杂,但它似乎正在仔细地试图避免页面边界问题.我不确定这是否是由于我上面描述的问题,或者它是否只是通过对齐数据来尝试获得更好性能的副作用.
无论如何,我的问题主要是 - 我在哪里可以找到关于这个问题的更多信息?我输入了"movdqu crossing page boundary"和我可以想到的每一个变体,但没有遇到任何特别有用的东西.如果有人能指出我进一步的信息,将不胜感激.