仕事がアレな感じでなかなか進まないながらも、 先日買った 悪魔本を読んでるわけですが、「5.3 カーネルにおけるメモリ管理」を読んで長年(?)の疑問が氷塊。もとい氷解。
FreeBSDといいWindowsといい、ユーザープロセスで使えるメモリ空間を減らしてまで、カーネルがユーザープロセス空間の高位(アドレス値の大きい端)を占めているのかずっと不思議だったのですが、どうもシステムコールの際のユーザー−カーネル間のデータコピーのコストを下げるためらしい。
両者が同じアドレス空間にあれば単なるメモリブロックコピーで済むところが、両者が違うメモリ空間にあると特殊な転送を行う必要があって遅くなるため……とのこと。カーネル時間の1/3はこの手のデータコピーに食われているそうなので、そりゃたしかに影響大きそうだなあ……。
まあ、x86ならカーネル空間とプロセス空間でセグメントを分ければ(ラージモデル)、セグメント間転送で済むのでそんなにコストもかからなそうな気もするけど、やっぱり案外コストがかかるのかもしれないし、移植性は確実に低くなるので避けたのかな。初期の386べったりな頃のLinuxとかMonaはどうしてる(た)んだろう。