NetBSDのコードが汚いとツイートしたところ、指摘されたので気になった点を書きます。
- ディレクトリの名前の付け方や階層がカオス
- 積極的に共通化してない
まずカーネルソースのsys/archの下の名前の付け方なのですが、CPUの名前とマシンからの名前がありごちゃまぜな感じです。
例
arm64 -> CPU
luna68k -> マシン
armのkernelソースは以下のディレクトにあります。
sys/arch/arm
sys/arch/evbarm
sys/arch/hpcarm
sys/arch/arm下もカオスでメーカー名とかCPUの名前があります。
marvell -> メーカー名
sunxi -> CPUコード名(メーカーはallwinner,CPU名はA10など)
またimxというCPUは初期のimx5まではFreescaleで、imx6以降は買収されてNXPになったのですが、
sys/arch/arm/imx
sys/arch/arm/nxp
というふうにCPU名とメーカー名に分かれています。
このディレクトリにはarmとarm32というディレクトリまであり、そもそもarmって32ビットじゃなかったっけ?とか思ったりします。これはおそらくarm32は後から共通化コードを作った時に別にしてしまったのではないでしょうか。 と思ったのですがlocore.Sがここにあるので最初からなのかもしれません。
sys/devの下に直接ファイルがあったりsys/dev/icの下にごちゃ混ぜでいれてるのもいけてません。
arm/pic/pic.cでPIC_MAXMAXSOURCESという定義が使われいます。PIC_MAXSOURCESというのもあります。SOC毎の定義もさまざまあり、なんのこっちゃ状態です。
共通化などで新しい実装を増やした時に、どれが新しくて、どれが古いのかがわかりにくいです。
arm/arm/armv6_start.Sというコードがあるのですが、imx/imx21でも使われていてv5でも使えるような気がします。とすると、armv5の方が良かったのではないでしょうか。v4のサポートは無いって意味のarmv6だったのでしょうか。
名前を自由に付けられる権利は必要だが、統一感がなくなると担当以外が理解しにくくなる。
NetBSDは多くのアーキテクチャをサポートする事を目標にしていると思うので、より分かりやすくディレクトリを掘るべきだと思います。
FreeBSDとNetBSDはbus_spaceというkpiを使っていますが、初期の時点では、個別実装だったのをFreeBSDでは力技で共通化してかなりコードが減っています。またこの共通化したものを標準化して古いものを消していたりします。しかしNetBSDでは古いものはいじらないってポリシーのようで、共通化もあまり積極的じゃないように見受けられますし、古いものはそのままにしているようです。
あと暗黙の決まりごとが多いように思います。cpu_initclocks()など自動的に呼び出されるので用意が必要なようです。あとグローバルでhzとか切ってあって、なんのこっちゃって感じです。
コメントが少ないのも気になります。
ソースツリーでビルドして、オブジェクトがソースツリーにできるのもいけてないです。
USBはumassでシングルユーザーの前で使われる可能性があるのに、デバッグ機能が貧弱なきがします。
NetBSDはターゲットを極力維持するという方針と思われますし、FreeBSDはターゲットを極力絞っていくという方針のため、違いが出ているのかもしれません。
armのCPUが入ったSOCのコードは、担当者が自分が作ったり修正したコードが影響するすべてのターゲットを持っていて確認できるわけではないので、対応が難しいことも事実です。
端的に言うとNetBSDはいじらない、FreeBSDはいじるということでしょうか。
またNetBSDは実装者に最大限の自由を提供するが、FreeBSDは統一を重んじるということでしょうか。
FreeBSDは力技で綺麗にしていて、メンテできないんなら消すって、脅迫じみたところもあります。あまりに力技なので、ちゃんと動くのか疑問なものも多いです。
NetBSDの悪口になってしまっていますが、FreeBSDのarmのv5の実装はいじったけっかNetBSDの30倍近くパフォーマンスが悪く、ほとんど使い物にならないことを考えると、NetBSDの方が現実的なのかもしれません。