google-code-prettify

2007-12-19

mprotectでPROT_WRITEした領域へのmemsetができない場合がある

NetBSDのcompat-linuxな環境で、以下のコードが動作しないらしい。
mprotect(buf, len, PROT_WRITE);
memset(buf, 0, len);
原因は、glibcがmemset時にリードアクセスを行う事があるためらしい。

memset時にリードアクセスをすると速くなる(事がある)理由は、以下の通り。
・アーキテクチャによっては、read時のキャッシュミスではキャッシュをfillし、write時のキャッシュミスではfillしない物がある。
・そのようなアーキテクチャの場合、4バイト毎に実メモリへの書き込みが発生してしまう。
・事前に一回空readをしてキャッシュラインをfillしておくと、writeアクセスは実メモリではなくキャッシュに対して行われるようになり、高速に書き込みが行われる。

via current-users@netbsd

0 件のコメント: