たまりば

パソコン・インターネット パソコン・インターネット三鷹市 三鷹市

OS自作[9]_SDからのブート
2014年02月02日 07:06

前回から1週間。時間が空いた時に復習のためにちまちま本を読み返してます。
中断前は大体1記事1日ペースだったんですが、こうちまちま進めていると作業日数が分からなくなってちょっと残念。

現在6日目まで読み返してみて、ブートの流れと、あとメモリのセグメントあたりがより深く理解できた気がします。

ちょっと自分の理解を深める意味も込めてPCの起動時の流れをまとめてみます。
  • PCを起動すると、CPUは仕様で決まったアドレスを読みに行く。
  • そこにはBIOSのROMがつながっており、CPUはそこに書かれた機械語を実行する。
  • BIOSのプログラムの指示によりCPUはI/Oを制御する。
  • それによりマザーボード上のチップセットか何かが働き、BIOSで設定されたブートドライブの最初のセクタ(マスターブートレコード: MBR)がメモリに読み込まれる。
  • メモリ上のMBRの内容の頭に処理が飛び、CPUはそこに書かれた機械語を実行する。
  • MBRのプログラムはBIOSにシステムコール(と呼んでいいの?)を発行することで他のセクタを読んだりできるので、そこのプログラムを実行したりする。
  • そこのプログラムがOS。

さてつまり、第1セクタの512バイトは何もプログラムを書かなくてもBIOSが頑張って読んでくれます。
フロッピーでもHDDでもSDカードでも、対応しているならBIOSでブートドライブに設定するだけで同様に使えるのです。
ということは、
SDからブート
こういうことで。
これはMBRしか使っていない1日目のコードを文字列だけ変えてSDカードに書いたものです。イメージ書き込みに使ったソフトはなんだか有名っぽいWin32DiskImager.exeというもの。
本のプログラムはフロッピーを使うことを想定しているので、実機動作確認のためにWindows98時代の3DNow!なノートPCを使っていましたが、うまくSDで動けば手軽なEeePCでも動作確認できて楽になりそうです。

そう思ってもうちょっと調べるといい情報が見つかりました。
http://www2192ue.sakura.ne.jp/~uaa/gomitext/2011/20111203/
BIOSにフロッピーを読ませるときはCHS(シリンダ・ヘッド・セクタ)の3値で指定するんですが、フラッシュメモリを読むときはどうすればいいのかと思っていたらどうも同じように読めるようです。
ただし同じメモリデバイスに対してもBIOSによって数値が変わってくるようで、そこの対処は必要そうです。
今のところ本のプログラムではフロッピーのシリンダ・ヘッド・セクタ数は固定のものとして扱っています。

しかし、データの最初の部分、0シリンダ目・0ヘッド目のフロッピーとSDでセクタ番号が同じ部分はそのまま読めそうです。
試しに作業フォルダにあった一番新しいものでやってみると、見事に動きました。(しかしこの画面記憶に無い。次にやる所だったかも)
SDブートその2
ただ実はこれが動くのは不思議な話で、このイメージは実質30kBほどあるのに対し、フロッピーのシリンダあたりのセクタ数は18なので、9kBまでしか正常に読めないはずなのです。
これを試したときは上記資料を見て0x3Fセクタや0x20セクタは読めるはずと思っていたんですが、よく考えたらフロッピーの方が少ないからそこまでしか読まないはずで。
謎が残りましたが、まあその方がモチベーションが湧くということで、今日はここまでとします。

◆ここ1週間くらいの成果◆
ブートの流れの理解が深まった
◆今日の成果◆
SDからブートできた  

  • OS自作[8]_環境復元
    2014年01月27日 01:44

    どうもブログを書く時間がとれません。1週間前のことを今ごろ書いてます。
    再開するにあたって、まずは今までの進捗を思い出すところからです。
    とりあえず過去の記事を全部読み直してみて、続いて作ったものを実行してみようとしたのですが、どうやって実行するのかを完全に忘れている。
    本を読みなおしてみて、どうやら用意されたバッチファイルから「make run」すれば良いとわかったのですが、これが動かない。
    エラーを見ると、
    process_begin: CreateProcess((null), copy /B asmhead.bin+bootpack.hrb haribote.sys, ...) failed.
    make (e=2): 指定されたファイルが見つかりません。
    make.exe[2]: *** [haribote.sys] Error 2
    指定されたファイルが見つからないといってもasmhead.binもbootpack.hrbもちゃんとある。
    しばらく悩んだのちググってみると、原因判明。
    ここここを見て分かったことは、ファイルが見つからないと言っていたのは「copy」自体のことで、どうやらパスの通った場所に別の「copy」という実行可能ファイルがあると実行対象が1つに決まらずこのエラーを出すようです。
    しかし探してみても他にcopyという名の実行ファイルは見つからず。ファイルでない何かを見ているのだろうか…。
    よく分からないので結局公式のサポートページを参考にmakefileを書き換えて動くようになりました。
    原因が分からないのは癪ですが、まあとりあえずこれで作業に戻れそうです。
    本の方も今までの分を読み返しているところで、ブートセクターのところが分かりそうな気がしています。

    -----

    ◆今日の成果◆
    実行できるようになった。
    ブートセクターが分かりそうな気がしてきた。  

  • OS自作[7]_復活
    2014年01月18日 18:47

    あれから早5年。
    ふと思い立って続きをやってみようかなと。
    あれからマイコンいじりにハマったりプログラミングが職業になったりしたので、たぶん当時より楽に進めるんじゃないかなと思う。

    -----

    ◆今日の成果◆
    5年超の眠りから目覚めた
    本のホコリをはらった