やりたくない日もあれば、普段より集中力が出る日もある。だから、本で指定された区切りで進めるかどうかは不明。多分、そうはならないと思う。でも、これだけは目標として持ちたい、というものがある。それは…
1日につき、最低1個は「新しく何か学んだぜー!」というものを書き記していく事
だ。ネットで日本の最新情報なんて漁っている時間があったら、勉強に使おう。永久にそういう生き方をしていくか?といえば流石にそれは無理だと思うが、まずは1ヶ月やってみようじゃないか。どういうやり方が現実的か?自分にあっているか?そんな事を考えていても始まらないので、とにかくやってみる。理屈を考えるパワーは勉強に使おう。
と、言うことで「OS自作入門」の1日目に挑戦である。
【お久しぶりだね、バイナリエディタ】
あー、画像データのコメント領域の文字列をチェックしたり、フォーマットの解析するのに使ってたアレか、と。まさかプライベート用途のPCにそんなものダウンロードする事になるとはねぇ、、なんて思いつつ本文を読み進める。どうやらフロッピーから立ち上げてメッセージを表示させるだけのプログラムを作るにあたって、いきなり全部バイナリで書いちゃえ!というのが作者の主旨のようだ。「プログラムをどんな方法で組むにせよ、最終的にはこういう姿になるのですよ」というのを、まず始めに意識させたいワケか。なるほど。
…って、、、納得したからってコツコツ全部打つかー!
作者の伝えたかった事は理解したよ、と勝手に決めつけて早速ズルをする。CD-ROMから出来上がったファイルをコピーし、フロッピーへ書き込み、【自作之輔】のフロッピードライブへ投入! なにやらスピーカ部から怪しげな音を出しながら(古いPCなんで単にボロくなってるだけと予想)も起動する【自作之輔】。頑張れ!
で、めでたく黒い背景の上に「hello, world」の文字列が表示された。おお、出た出た。人の作ったファイルで、中身も理解せずに起動させたダケなので当然ではあるが、特に感動はない。しかし、用意した環境でこの本を読み進めていけばOKだという確証は持てた。安心して学習を続けていこう。
【ざっくりCPU論】
そしてバイナリエディタを使ってやって見せた事は何だったのか?について説明する為にCPUの説明が始まった。「CPUはONとOFFしか理解出来ないんだぜ!」というフレーズが、ついつい「計算不可能性を設計する」で見た「ノイマン型の限界」議論を思い起こさせたりするわけだが、ここで量子コンピュータの持つ可能性について思いを馳せてしまうと脱線もいいところなので、一旦そのネタは忘れることにして読み進める。といっても、あとは16進と2進の相性の良さを改めて述べているくらいだが。(「予備知識なしで読み進められます」というだけあって、実に丁寧だなぁ、と感心)
【こんにちは、アセンブラ】
次にバイナリエディタでやった事を、アセンブラで書くとドウなるか?についての講義が始まる。「OS自作入門」では、NASMというフリーのアセンブラの親戚(文法が似ているという意味で、同じルーツを持っているワケではなさそう)で、作者オリジナルのNASKというものを使う、とある。
- 現時点で未解決な疑問 -
「NASKはNASMより自動最適化能力が高い」とあるが、NASMがどのように駄目なのかについては良く分からなかった。Wikiでアセンブリ言語
について眺める限り、ほぼ機械語に近いアセンブリ言語を利用しているにも拘わらず、果たして機械語に変換する過程で出力されるものに違いが出るのか?という点について、正直イメージが沸かない(これは多分、プリミティブな命令しか現時点で見ていないせいで、本来アセンブラは私の想像よりはるかに自由度の高い表現が使える、ということなのだろう)。OS-Wikiでの作者の発言
を見る限り、NASMの実装には何かよほど間抜けな欠陥があるようだ。
-------------
まずDBとRESBという命令が出てきた。この命令はNASKのみで有効な命令であって(でも文法が似てるって事ならNASMでも使えるのか?)、「アセンブラといえば使う命令は決まってるんだよ君!」という事じゃないんだろうなぁ、、という事で、これは付録としてつけられているツールの機能についての学習なんだと理解することにする。
DB(data byte) : 宣言されたデータを1バイト分だけ直接書く。続けて使うことで理論上は何でもファイルに書き込める。が、コツコツと埋めるだけの機能なので、同じデータの繰り返し等をしたい場合にはプログラミング作業として冗長になってしまう。
RESB(reserve byte):後に来る数字分のバイトを確保する。NASKでは確保した際に0x00で埋める形でそれを実現するので、0x00でとにかくディスクスペースを埋めたいような場合にも利用される。
しかし、相変わらずこれだけの命令で作られたアセンブラでは、何がなにやらサッパリである。そんなわけで新しい命令(及び、既出命令の新しい利用方法)が登場する。コメント命令万歳!
; : コメント命令。プログラムに解説を入れられる。おかげで一気に可読性が上がる。
DB : 既出命令だが、実は""で囲んだ文字列を直接書くことが出来るという情報が明かされた。(例:DB "Hello, world") といっても当然ASCIIコードの範囲だけの模様。
DW(data word): ワード(16ビット=2バイト)単位で処理されるDB命令。
DD(data double-word): ダブルワード(32ビット=4バイト)単位で処理されるDB命令。
ちなみにC言語等と同様、DB系の命令では、Hex(16進)と10進のどちらを利用しても良い。
そして重要なのが「$」である。先頭から何バイト目がを計算してくれるための変数として利用されており、プログラム上で、それより前方に記述されるデータの長さに変更があったとしても処理内容を書き直さなくても良いように使うことが出来る。例えばつまり、RESBを使ってある箇所から特定箇所までをずっと0x00で埋めたい場合に、その処理のスタート地点を数字で明記する代わりに、「ここから」という意味で「$」を使うことが出来るわけだ。
【その他メモ】
FAT12 :フロッピーのフォーマットとして生き続けているFATの初期バージョン。フロッピーから起動させる形にしている限りはお付き合いすることになりそう。詳しくはココ で。
ブートセクタ :フロッピーに存在している最初のセクタ。PCは、先ず始めにここを読み込み、最後の2バイトをチェック(0x55 0xAAか否か)する事で起動用のプログラムが書かれているかどうか?を判定している。何故に[0x55 0xAA]なのか?については謎。
IPL :initial program loaderの略。ブートセクタにOS全てを格納するのは容量的に無理があるので、ブートセクタにはOS自身をロードする為のプログラムのみを格納するのが一般的(とは言え、実際には一発でOSを読み込むよりも、OSを読み込むためのプログラムをさらに呼び出すようなケースも多いらしい)で、そのプログラムの事をIPLと呼ぶようだ。別称「ブートローダ 」。
おお、なんだこりゃ?!というくらい長い記事になった。しかし楽しい!初日から難しくては読者がドン引きするので、作者はかなり手加減しているものと思われるため、油断は大敵であるが。。





