[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pbsd-mg2] L1 cache problem



Takemura です。

L1 cache が ON になっていると init が起動できない問題で、
L1 cache は完全に OFF にされたままになっていました。

この問題は結構難しい問題で、ちゃんとした解決にはほど遠いのですが、
とりあえず VM の page size を 4KB から 16KB に変更し、
sys/uvm/uvm_fault.c の uvm_fault() に MachFlushCache() をいれることに
より、一応ちゃんと動くようなので、cvs に commit しました。

篠原さん、鈴木さん、品田さんからいろいろ助言をいただきました。
ありがとうございました。

page size を大きくしたのは、L1 cache の virtual address aliasing を
防ぐためです。
page size が L1 cache のサイズより大きければこの問題は発生しません。
(たしょうメモリが無駄遣いされますが、大したことはないと思います)
VM の page size は、init をはじめとするコマンドの ELF バイナリを
ロード(リンクして実行ファイルを作成する)するさいの
ELF_MAXPAGESIZE より小さくないといけないのですが、GNU の bfd の
elf32-mips.c の ELF_MAXPAGESIZE はわずか 4KB になっているので、
これを 16KB 以上にして再コンパイルする必要が生じます。
これが再コンパイルされていないと、コマンドが正しく動作しないのですが、
だまって segmentation fault を起こしたりしていやらしいので、
sys/kern/exec_elf32.c にチェックルーチンを入れました。
(ついでにインチキして、実行もできるようにしてしまいました)

page size は 8KB にすればよいのですが、locore_mips3.S あたりを
かなりたくさん修正しないといけないっぽかったので、安易に 16KB に
してしまいました。

uvm_fault() の後に MachFlushCache() を入れたのは、まったくの
対処療法です。おおざっぱでいいかげんとしか言いようがありません。
これで常に OK かどうかもまったく分かりません。
L1 cache が使えないよりはマシといったところです。
disk から読み込んだ ELF バイナリが data cache に残っていて phys. mem.
に書き戻されていない状態で、コードを実行してしまっているのでは
ないかと思って VM(UVMですが)のなかを眺めたのですが、
ページのキャッシュなどが複雑すぎて、挫折してしまいました。

Takemura