フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【3日目】OS自作入門を読んで振り返りと注意点

30日でできる! OS自作入門

30日でできる! OS自作入門

今回の内容

今回の内容は重たいです個人的に・・・。

  • ディスク(イメージ)をメモリのブートセクタに書き込むアセンブラの解説
  • ディスク(イメージ)に画面が真っ暗になるOSを追加してブートセクタから呼び出す
  • C言語の導入

これまでの知識がわかった上で進むので、何度か文章を読み返し赤字でペン入れをしながら読み進めました。20~30分で終わってたのに1時間半以上かかってる・・・。

やってることは前回の続きでアセンブラで作成したディスクイメージをメモリにどんどん書き込んでいきます。ディスクイメージを扱っているのでいきなりHDDのセクタとかシリンダーとか出てくると戸惑うかもしれませんが、今作っているディスクイメージはあくまでイメージであって最終的には物理的なところに存在するものなんだという意識をもつと解消するかもしれません。

最後に登場するC言語ですが通常gccでコンパイルすれば終わり!っていうのに+5ステップぐらいくっついています。これは解説にもありますが、なるべく普段コンパイラが隠している部分(やってくれている部分)を解説のために細分化したためです。「実はもっとステップがあるんだなあ・・・」というのが気づきでもあります。

注意点

2日目でも同じ状況でしたが、makeコマンドの一部のオプションを使用すると起動に失敗します。

make.exe[2]: Leaving directory `C:/Users/xxx/Desktop/my_os/tolset/harib00a'
make.exe[1]: Leaving directory `C:/Users/xxx/Desktop/my_os/tolset/harib00a'
copy haribote.img ..\z_tools\qemu\fdimage0.bin
process_begin: CreateProcess((null), copy haribote.img ..\z_tools\qemu\fdimage0.bin, ...) failed.
make (e=2): 指定されたファイルが見つかりません。
..\z_tools\make.exe: *** [run] Error 2

make.exeがwindowsのcopyコマンドプロセスを実行しようとした際に、なぜだか第一引数にnullを第二引数にcopy haribote.img ..\z_tools\qemu\fdimage0.binコマンドをいれてしまっています。

http://hrb.osask.jp/wiki/?faq/makeに似たようなケース発生時のトラシューが掲載されていますが、cygwinつかってないしディレクトリパスにもスペース入っていません。

エラーを出力しているCreateProcessを調べると、Microsoftのサイトに使用例がのっています

BOOL CreateProcess(
  LPCTSTR lpApplicationName,                 // 実行可能モジュールの名前
  LPTSTR lpCommandLine,                      // コマンドラインの文字列
  LPSECURITY_ATTRIBUTES lpProcessAttributes, // セキュリティ記述子
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // セキュリティ記述子
  BOOL bInheritHandles,                      // ハンドルの継承オプション
  DWORD dwCreationFlags,                     // 作成のフラグ
  LPVOID lpEnvironment,                      // 新しい環境ブロック
  LPCTSTR lpCurrentDirectory,                // カレントディレクトリの名前
  LPSTARTUPINFO lpStartupInfo,               // スタートアップ情報
  LPPROCESS_INFORMATION lpProcessInformation // プロセス情報
);

第一引数には実行可能モジュールの名前とあるので本来であればCreateProcess(copy, haribote.img ..\z_tools\qemu\fdimage0.bin)という形で実行されるところが、なぜだか引数が変な位置に指定されてしまっていますね。makeコマンドがcmd.exeで用意されているcopyコマンドをどのように呼び出しているかというところなのでこれ以上はお手上げ・・・。

回避策

回避策としてはさっきのリンクのコメントにあった以下の方法で対処できます。

Makefile内の記載変更

TOOLPATH = ../z_tools/
MAKE     = $(TOOLPATH)make.exe -r
NASK     = $(TOOLPATH)nask.exe
EDIMG    = $(TOOLPATH)edimg.exe
IMGTOL   = $(TOOLPATH)imgtol.com
#COPY   = copy
COPY     = cmd.exe /C copy
#DEL      = del
DEL      = cmd.exe /C del

cmd.exe経由でcopy/delコマンドを実行することを意図的に書くとうまくいくようになります。cmd.exeをつけるとモジュールとして認識してくれるということなんだろうか???

あとで出てくるC言語のときのMakefileも以下のところにcmd.exeをつけました。

haribote.sys : asmhead.bin bootpack.hrb Makefile
    cmd.exe /C copy /B asmhead.bin+bootpack.hrb haribote.sys