SunOS 4.xでMOを使うには |
YAMAMORI Takenori ●yamamori |
ここで,scsi_slave()をラップするためのwrap_scsi_confsubr.cと, コンパイルなどの全体の処理を行なうためのMakefileを作成します.
wrap_scsi_confsubr.cを下のリストに示します. 前述の通り,ここではscsi_slavE()を呼び出し, その直後に,所定の構造体の値がDTYPE_OPTICALだった場合はDTYPE_DIRECTに書き換える という処理をしています.scsi_slave()とscsi_slavE()の間では, 関数の引数や戻り値はすべてそのまま受け渡しています.
#include <scsi/scsi.h> scsi_slave(devp, canwait) struct scsi_device *devp; int canwait; { int status; status = scsi_slavE(devp, canwait); if (devp->sd_inq->inq_dtype == DTYPE_OPTICAL) { devp->sd_inq->inq_dtype = DTYPE_DIRECT; } return status; } |
Makefileは下のリストのようになります. ここでは,もとの/sys/sun4m/OBJ/scsi_confsubr.oから, 前述の通りhead,echo,tailを使ってシンボルテーブルを書き換えた scsi_confsubr_E.oを作り,それとwrap_scsi_confsubr.oとをリンクして scsi_confsubr_mo.oというファイルを作成するようになっています. headやtailコマンドでは,キャラクタのバイト数を0からではなく1から数えるため, 0から数えたアドレスとは1だけずれる点に注意してください. リンクの際にはリロケータブルオブジェクトが出力されるように 「-r」オプションが必要です. なお,オリジナルのscsi_confsubr.oは,あとで置き換えられることになるため, 先にscsi_confsubr.o-0という名前にリネームしておき, Makefile中でもこの名前で参照するようになっています.
SCSI_CONFSUBR = /sys/sun4m/OBJ/scsi_confsubr.o-0 OBJS = wrap_scsi_confsubr.o scsi_confsubr_E.o TARGET = scsi_confsubr_mo.o all:: $(TARGET) $(TARGET) : $(OBJS) /bin/ld -r -x $(OBJS) -o $@ scsi_confsubr_E.o : $(SCSI_CONFSUBR) ( \ head -c 4328 $(SCSI_CONFSUBR); \ echo -n E; \ tail +4330c $(SCSI_CONFSUBR) \ ) > $@ |
ここまでの準備が整ったら,適当な作業ディレクトリ上で下図のようにmakeを実行し, できあがったscsi_confsubr_mo.oで/sys/sun4m/OBJ/scsi_confsubr.oを置き換えます.
カーネル部分のコンパイルにはなりますが,コンパイラはSunOS標準のccでなく, gccを使っても構いません.ただしldについては,Makefileを見ればわかるとおり, GNU ldではなくSunOS標準の/bin/ldを使用します.
$ su # cd /sys/sun4m/OBJ # mv scsi_confsubr.o scsi_confsubr.o-0 ← オリジナルファイルをリネーム # exit $ make ← いよいよmake $ su # cp scsi_confsubr_mo.o /sys/sun4m/OBJ/scsi_confsubr.o ← 修正後のファイルで置き換え # chmod 444 /sys/sun4m/OBJ/scsi_confsubr.o ← 念のためパーミッション設定 |
このあと,カーネルを再構築して/vmunixを置き換えリブートすれば, MOがハードディスクとして認識されるようになるはずです. カーネルを再構築する詳しい手順については省略しますが, SunOS 4.xの場合,いわゆるBSDスタイルのconfigコマンドを実行してから 「make depend; make」を実行するという方式です.