IIJ (NetBSD)

NetBSDベースルータファームウェア開発

2007/4 ... 2008/8

IIJは日本初のインターネットサービスプロバイダーで、研究部門を含め、多くのサービスを提供しているが、実はSEILという、NetBSDベースのルータ製品も開発している。2007年に参画させてもらったときには、翌年に新製品のリリースが予定されているにも関わらず、人手不足のため開発が滞っていた。当時最先端のOCTEONという64-bitのMIPSプロセッサを採用した製品だが、そのハードウェアへの対応作業に、誰も手を付けていない状況だったので、チームに入るなり、手を上げて、移植作業と、NetBSDのMIPS64対応に着手した。

NetBSDは、すでに32-bitのMIPSには対応しており、また、x86-64やAlphaといった、別の64-bit CPUにも対応していたので、それら前例を組み合わせて、64-bit化を進めていった。具体的には、まずクロスコンパイラをMIPS64に対応させ、カーネルを64-bitでコンパイルするところから始めた。C言語ではなくアセンブラで書かれる部分に関しては、手動で注意深く64-bitの命令に書き換える必要があった。MIPSには複数のABIがあり、N32 ABIでは、仮想空間(ポインタのサイズ)は32-bitのままで、レジスタや物理空間を64-bitに拡張される。

カーネルをN32で64-bit化して、はじめてユーザーランドのコードを実行するときに、最初に実行されるinitコマンドの先頭に、もっとも簡単なシステムコールの一つであるumaskを仕込んでおいて、最初のシステムコールが成功したときには、思わずガッツポーズをした。ユーザーランドのlibcの共有ライブラリ、ダイナミックリンカ(ld.so)、シグナル周辺、getcontext/setcontext、pthread関係、softfloatなど、多く学ぶことができた。