はてなキーワード: プリフェッチとは
https://www.suzukikenichi.com/blog/google-removes-amp-badge-from-search-results/
このあたりの記事を読んでも、英文で検索しても、検索結果からAMP「インジケーター」が削除されただけ(キャッシュやプリフェッチ等の機能は残っている)という業界の認識らしいのだが、色々と試してみると、もろもろ完全になくなってしまっているっぽいんだが。
https://blog.jxck.io/entries/2021-05-28/blog-over-sxg.html
最近大騒ぎになっているIntelなどのCPUレベルの脆弱性、MeltdownとSpectreについてメモ。最初はキャッシュ内のデータを読み取るのかと勘違いしていたのでその点を中心に。
・CPUによってアクセスが制限されているはずのカーネル領域データへのアクセスがアウト・オブ・オーダー実行(OoO)で動作してしまうことがある(Meltdown)
・OSによってアクセスが制限されているはずの別プロセスのユーザー領域データへのアクセスが投機的実行で動作してしまうことがある(Spectre)
ただし
・OoOや投機的実行でアクセスが制限されている領域へのアクセスが行われても、ソフトウェアがアクセス可能なレジスタやメインメモリ上の値は、OoOも投機的実行もないCPUと変わらない。MeltdownとSpectreでこの原理が破れたわけではない。
・キャッシュにはアクセスできない領域のデータが入っているかもしれないが、ソフトウェアから「L1キャッシュのn番目のデータを読む」といった操作はできないし、実のところMeltdownとSpectreではキャッシュにどんな値が入っているかは関係ない。
そこで、OoOや投機的実行でアクセスが制限されている領域へのアクセスが行われている間に、次のような処理が走るようにする。
a = *kptr; /* kptrはアクセスが制限されている領域へのポインタ */
b = array[a<<12]; /* 配列arrayは自プロセスの領域。12ビット左シフトはハードウェアプリフェッチャによる先読みの影響を防ぐため。 */
参考:
hiuchidaさん 「MeltdownとSpectreの違いについて分かったこと」
https://qiita.com/hiuchida/items/2248b379197a5052029e
品川高廣さんのツイート
https://twitter.com/utshina2/status/948809945327157253
配列arrayは自プロセスの領域内なので後から問題なくアクセス可能。変数nをカウントアップしながらarray[n<<12]のアクセス時間を順次計測すると、array[(*kptr)<<12]はキャッシュに残っているのでアクセス時間が早い。これによって*kptrの値が推定できる。
つまり、キャッシュに入っている値そのものではなく、あるアドレスがキャッシュされているか否かという形でOoOや投機的実行中の一時的な値を記憶させてしまう。