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