OS自作入門読書中。
第3日目に分からない部分を結構残しているのですが、
とりあえず先に進んでみました。
第4日目はVRAMを扱っています。
ついに画面を好きに書くことが出来るんです!
しかもアセンブラからC言語での開発が可能になってきているので、
だいぶ楽に読み進めることが出来ます。
ちょっとソースコード弄って
画面を作ってみましたよ!
この画面に出ている色がデフォルトで登録されている
16色みたいですねぇ。
この調子で進めるべし!進めるべし!
さて先日IT MediaからたどったWEBサイトに
面白いことが書いてありました。
世界のインターネット人口とその地域別構成です。
大雑把に言うと世界中でインターネットを使用している人は
約7億人で、そのうち2.5億人が英語が公用語
もしくは準公用語である国にすんでいるみたいです。
http://www.comscore.com/press/release.asp?press=849
いろいろ分からないことがあるのですが、
落ち着いて考えてみたところ、3日目の中で
一番気持ちが悪いのが、次の1行なのです。
—
JMP DWORD 2*8:0×0000001b
—
この行が理解できないのです。
NASMのマニュアルによると、
—
JMP imm ; E9 rw/rd [8086]
JMP SHORT imm ; EB rb [8086]
JMP imm:imm16 ; o16 EA iw iw [8086]
JMP imm:imm32 ; o32 EA id iw [386]
JMP jumps to a given address. The address may be specified as an absolute segment and offset, or as a relative jump within the current segment.
JMP SHORT imm has a maximum range of 128 bytes, since the displacement is specified as only 8 bits, but takes up less code space. NASM does not choose when to generate JMP SHORT for you: you must explicitly code SHORT every time you want a short jump.
You can choose between the two immediate far jump forms (JMP imm:imm) by the use of the WORD and DWORD keywords: JMP WORD 0×1234:0×5678) or JMP DWORD 0×1234:0×56789abc.
—
との事なのですが、全然分かりません。
JMP DWORD 0×1234:0×56789abc.
と書いたら一対何処に飛んでいくのでしょうか。
ここでギブアップしてまたも質問させてもらおうかとも
思ったのですが、P171にこれは特別なJMP命令との記述があり、
またセグメント等の単語が出てきているので、
一旦ここでペンディングして先に読み進めることにします。
引き続きOS自作入門を読書中。
やっと3日目を読み終わりました。
ようやくC言語で書かれたコードを
アセンブラで書かれたブートストラップから
呼び出せるようになりました。
でもやっぱり分からない部分が盛りだくさん。
本文では何かうやむやにされている気がするのですが、
特に分からないポイントはオブジェクトのリンクや
実行ファイルに関わる部分です。
僕の現状の認識ではC言語で書かれたプログラムは
コンパイルされ、アセンブルされてオブジェクトファイルになります。
このオブジェクトファイルをリンクして初めて実行ファイルが
出来ると思うのですが、この本ではオブジェクトファイルを
単純にくっつけてしまっているのです。
実行ファイルのフォーマットとかはどうなっているのでしょうか???
もうちょっと調べてみようと思います。
さてアセンブラのソースコードが読めないという
なんとも情けない事態になってしまいましたので、
ちょっとアセンブラの勉強をしてみました。
OS自作入門の本文ではオリジナルのアセンブラ(nask)が
使用されているのですが、汎用性を考え
nasmを利用してみることにしました。
(http://sourceforge.net/projects/nasm)
アセンブラ系の情報サイトは英語が多くてなかなか
いい感じのサイトにたどり着けなかったのですが、
マシン語大研究というサイトが量、質共にちょうどよい感じでした。
(http://hp.vector.co.jp/authors/VA015412/index.htm)
さてアセンブラの勉強を一通り終え(読めるようになっただけ)
もう一度昨日のソースコードに向き合ってみたのですが。。。
いまだ分かりません。
—
DB 0×90
DB “HELLOIPL” ; ブートセクタの名前を自由に書いてよい(8バイト)
DW 512 ; 1セクタの大きさ(512にしなければいけない)
DB 1 ; クラスタの大きさ(1セクタにしなければいけない)
DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする)
DB 2 ; FATの個数(2にしなければいけない)
DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする)
DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない)
DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない)
DW 9 ; FAT領域の長さ(9セクタにしなければいけない)
DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない)
DW 2 ; ヘッドの数(2にしなければいけない)
DD 0 ; パーティションを使ってないのでここは必ず0
DD 2880 ; このドライブ大きさをもう一度書く
DB 0,0,0×29 ; よくわからないけどこの値にしておくといいらしい
DD 0xffffffff ; たぶんボリュームシリアル番号
DB “HELLO-OS ” ; ディスクの名前(11バイト)
DB “FAT12 ” ; フォーマットの名前(8バイト)
RESB 18 ; とりあえず18バイトあけておく
—
という部分がいつ実行されるのか分からないのです。
どう考えても実行されていないと思うのです。
どうしようもないのでOS自作入門のサポートページで
質問させていただきました。
すると筆者のKさんから直接回答がいただけました。
—
その部分はデータなので一度も実行されません。でもその部分にそのデータがないとWindowsなどの他のOSにディスクを認識してもらえないのです。それでいやいや入れています。
—
との事です。(Kさん、本当にありがとうございました)
つまり僕は実行されなければこれらの部分が書き込まれないと
DB命令やDW命令などを勘違いしていたのです。
これらの命令は実行されるのではなく、
アセンブル時に指定したコードに変更されるのでした。
これでここまでのところほぼ納得できるようになりました。
急いで次に進まないと!