SunOS 4.xでMOを使うには

YAMAMORI Takenori ●yamamori

●ソースファイルとMakefileの作成

ここで,scsi_slave()をラップするためのwrap_scsi_confsubr.cと, コンパイルなどの全体の処理を行なうためのMakefileを作成します.

○wrap_scsi_confsubr.cの作成

wrap_scsi_confsubr.cを下のリストに示します. 前述の通り,ここではscsi_slavE()を呼び出し, その直後に,所定の構造体の値がDTYPE_OPTICALだった場合はDTYPE_DIRECTに書き換える という処理をしています.scsi_slave()とscsi_slavE()の間では, 関数の引数や戻り値はすべてそのまま受け渡しています.

★リスト wrap_scsi_confsubr.c

#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の作成

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中でもこの名前で参照するようになっています.

★リスト 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の実行

ここまでの準備が整ったら,適当な作業ディレクトリ上で下図のようにmakeを実行し, できあがったscsi_confsubr_mo.oで/sys/sun4m/OBJ/scsi_confsubr.oを置き換えます.

カーネル部分のコンパイルにはなりますが,コンパイラはSunOS標準のccでなく, gccを使っても構いません.ただしldについては,Makefileを見ればわかるとおり, GNU ldではなくSunOS標準の/bin/ldを使用します.

★ makeの実行とscsi_confsubr.oの置き換え

$ 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」を実行するという方式です.


To『SunOS 4.xでMOを使うには』[index]


このページは、技術評論社 Software Design 2002年5月号、『(まだまだ現役)SunOS 4.xでMOを使おう』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 [Home]
yamamori