2006年5月 のアーカイブ

OSを自作する(6)

2006年5月6日 土曜日

OS自作入門読書中。
第3日目に分からない部分を結構残しているのですが、
とりあえず先に進んでみました。

第4日目はVRAMを扱っています。
ついに画面を好きに書くことが出来るんです!
しかもアセンブラからC言語での開発が可能になってきているので、
だいぶ楽に読み進めることが出来ます。

ちょっとソースコード弄って
画面を作ってみましたよ!
初めての画面描画
この画面に出ている色がデフォルトで登録されている
16色みたいですねぇ。

この調子で進めるべし!進めるべし!

やっぱり英語は避けては通れない?

2006年5月6日 土曜日

さて先日IT MediaからたどったWEBサイトに
面白いことが書いてありました。
世界のインターネット人口とその地域別構成です。

大雑把に言うと世界中でインターネットを使用している人は
約7億人で、そのうち2.5億人が英語が公用語
もしくは準公用語である国にすんでいるみたいです。
http://www.comscore.com/press/release.asp?press=849

(続きを読む…)

OSを自作する(5)

2006年5月6日 土曜日

いろいろ分からないことがあるのですが、
落ち着いて考えてみたところ、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を自作する(4)

2006年5月6日 土曜日

引き続きOS自作入門を読書中。
やっと3日目を読み終わりました。

ようやくC言語で書かれたコードを
アセンブラで書かれたブートストラップから
呼び出せるようになりました。

でもやっぱり分からない部分が盛りだくさん。
本文では何かうやむやにされている気がするのですが、
特に分からないポイントはオブジェクトのリンクや
実行ファイルに関わる部分です。

僕の現状の認識ではC言語で書かれたプログラムは
コンパイルされ、アセンブルされてオブジェクトファイルになります。
このオブジェクトファイルをリンクして初めて実行ファイルが
出来ると思うのですが、この本ではオブジェクトファイルを
単純にくっつけてしまっているのです。

実行ファイルのフォーマットとかはどうなっているのでしょうか???
もうちょっと調べてみようと思います。

OSを自作する(3)

2006年5月2日 火曜日

さてアセンブラのソースコードが読めないという
なんとも情けない事態になってしまいましたので、
ちょっとアセンブラの勉強をしてみました。

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命令などを勘違いしていたのです。
これらの命令は実行されるのではなく、
アセンブル時に指定したコードに変更されるのでした。

これでここまでのところほぼ納得できるようになりました。
急いで次に進まないと!