デバイスドライバの移植(爆笑)

木曜日はソフトミーティング(ソフト班のミーティング)がありました。

山崎研には3つの班があり、別に人数制限とかそういうのは全然ないので好きなところに入ればいいのだ!

  • ハード班
  • ソフト班
  • ロボット班

一応正式配属はまだ?扱いらしい?けど、今年の7人(そのわきで輝く小さな星までもが見えそうな人数ですね!!)の希望はハード5・ソフト2・ロボット1みたいです。

RMTP*1TRONを動かそうとか、TRONは設計が古いしマルチプロセッサとか考えてないからその段階になると怪しくなると先生は難色を示したり、とりあえずシングルタスクで起動する方向で押し切られたり。卒業した先輩方は、修論出せといったらフェイクのファイルを置いておくという暴挙に出たらしい。拡張子ェ。M1にも卒論がまd
そしてその場のノリで飛んできた仕事がLinuxPCIデバイスドライバ*2の64ビット版への移植。どういうことなの…。確かにブートローダかデバドラ書く講習が滞ってはいるけれども。
渡されたのは昔の先輩が書いたツールセット。ドライバにはMakefileにCファイルとヘッダファイルが1つずつ、できたドライバを組み込み・解除するシェルスクリプトが入っていました。予想通り?多分にシンプルな部類で問題のCファイルも850行程度の1枚で、まだほっとする範囲か…。しかしやはり予想通りアンダースコアから始まる怪しげな修飾子(emacsで色変わってるし)が連発される世紀末ソースコードだった。
どっちかっていうとデバイスドライバを書くというよりは64ビットLinuxデバイスドライバのコードの書き方に合わせる作業か。とにかくこのソースを64ビットgccにぱなさないと分からないので、なんかいろいろめんどくさそうなので、なぜかクロスコンパイラ自動ビルドツールを持ってきました。「これってクロスコンパイルっていうんじゃね?」と思ってググってしまったのが運の尽きよ…。
見つけたのはcrosstool-ng。CPUやOSを設定すると自動的にダウンロードしてその環境向けのコンパイラをビルドしてくれるらしい。どう見てもどっかのマシンに64ビットOSインストールして勝手に入ってるgcc使った方が簡単です本当にありがとうございました。


sudo -sでルートで作業するとホームディレクトリで書き込み権限がなくて詰んで台パン。ローカルのyappyでは普通に書き込めるから、これNISアカウントだから駄目なのかね。ダウンロードしたアーカイブファイルを/tmpにコピーしてきて展開。いつもの色々入ってるファイル構成がみえるので説明に従ってconfigureのヘルプを確認、デフォルトの/usr/local行きでいいので特にオプションを指定せずにconfigure。

./configure --help
./configure
make
make install

なんか/usr/local/binにパスが通ってなかったので.tcshrcに書き加える。コマンドはct-ng。適当なディレクトリを作って、

ct-ng menuconfig
ct-ng build

メニューコンフィグでBIOSみたいなGUIで設定できる。ここでCPUアーキテクチャやOSやコンパイラやそのバージョンを設定してbuildで全部ダウンロードしてビルドしてくれる。x86の64ビットに変更。一応これで全部自動でビルドしてくれるはずなんだが…。
最初のエラーは6分後。ダウンロードされたファイルを消してもう一度やったらうまくいったから、ダウンロードしたファイルが壊れていたらしい。失敗したのに何も変えずにもう1度やり、結果が6分経つまで分からないこの感覚、たまらないね。
次のエラーは50分後。libc*3のビルドでエラーが出る。言われた通りログファイルを見に行ったら17MBもあって、emacsに警告された。__memcpyか何かがないかなんかで死んでた。知らんがな。輪講の時間などを利用してeglibcとglibc両方試すとか、今の自分のOSとコンパイラとライブラリのバージョンを調べて合わせるとかしてみたけどlibcのどっかで死ぬ。
まあ最初からこうなるのは目に見えてたけど。ググってもトラブルの話ばっか出てくるし。ファイルが壊れるから自分でLinuxカーネル落としてきて置いたとか、壊れるからスクリプトにこのパッチあてろとか。そんな上級者向けなことできません><。困ってcg-ntとだけ打ってヘルプ出したらlist-samplesというのがあった。

% ct-ng list-samples
(抜粋)
x86_64-unknown-linux-gnu [G ]
x86_64-unknown-linux-uclibc [G ]

あるじゃねーか。これ多分一応どこかでビルド成功してるよね。種類とかバージョンとかが結構信頼性のあるものになってるはず…。

% ct-ng distclean
% ct-ng x86_64-unknown-linux-gnu
% ct-ng menuconfig
(確認。なんかC++とかJavaとかまでオンになってたのでいらないので消した。)
% ct-ng build

さてどうなるか…。


追記:
Cライブラリ通りました(爆笑)。サンプルは偉大だった。

[INFO ] Installing C library
[EXTRA] Configuring C library
[WARN ] Removing "-pipe" for use with glibc>=2.6
[EXTRA] Building C library
[EXTRA] Installing C library
[EXTRA] Fixing C library linker scripts
[INFO ] Installing C library: done in 2124.22s (at 109:43)
[INFO ] =================================================================
[INFO ] Installing final compiler
[EXTRA] Configuring final compiler
[EXTRA] Building final compiler

今ここ。final compilerってなんだ…?まあいいやがんばれ。

[INFO ] Installing native gdb
[EXTRA] Building static target ncurses
[ERROR] make[1]: *** [tic] Error 1
[ERROR] Build failed in step 'Installing native gdb'

おいいいいいいいいい
デバッガとかいらねーだろ…。次はテストスイートなのに…。どうして…どうして…。
menuconfigからデバッガ系のを全部オフにした。これは耐えるんじゃね…?さすがにもう帰ろう…。

*1:研究室で作ってるプロセッサ。

*2:ボードでプログラムが動作した結果がI/Oからケーブルを通してPCに送られてくるのでそれを扱うPC側のドライバが必要。

*3:Cライブラリ。printfとか入ってるやつ。