ページ境界を越えてデータにアクセスする movdqu 命令で xmm レジスタをロードする簡単なテスト プログラムがあります (OS = Linux)。
次のページがマップされている場合、これは問題なく機能します。マップされていない場合は、SIGSEGV を取得しますが、これはおそらく予想どおりです。
ただし、これにより、アライメントされていないロードの有用性がかなり低下します。さらに、アラインされていないメモリ参照を可能にする SSE4.2 命令 (pcmpitri など) も、この動作を示すようです。
それはすべて問題ありません - pcmpistri を使用した strcmp の実装が多く、この問題にまったく対処していないように見えることを除いて - そして、これらの実装が失敗する原因となる簡単なテストケースを考案することができました。一方、一度にバイト単位の単純な strcmp 実装は、同じデータ レイアウトで問題なく動作します。
もう 1 つ注意してください。64 ビット Linux 用の GNU C ライブラリの実装には、より安全な方法で pcmpistri 命令を使用するように見える __strcmp_sse42 バリアントがあるようです。この strcmp の実装はかなり複雑ですが、ページ境界の問題を慎重に回避しようとしているようです。それが上で説明した問題によるものなのか、それともデータを調整してパフォーマンスを向上させようとしたことの単なる副作用なのかはわかりません。
とにかく、私が持っている質問は、主に、この問題についてどこで詳しく知ることができますか? 「movdqu クロス ページ境界」と入力して、考えられるすべてのバリアントを Google に入力しましたが、特に役立つものは見つかりませんでした。誰かが私にこれに関する詳細情報を教えてくれるなら、それは大歓迎です。