30日でできる!OS自作入門パート5(10日目)

いよいよ10日目です。これで大体1/3の進捗ですね。

前回はメモリ管理を行いましたがその続きからやっていきます。

メモリの確保と解放を繰り返しているうちに連続しない小さな空きがたくさんできてしまうため0x1000バイト単位で確保と解放をする関数を作り管理するようです。その際、0x1000バイト単位に切り上げたり切捨てたりするという話で4Pくらい使っています。ちなみに0x1000バイトは4KBです。

重ね合わせ処理


10日目のサブタイトルは『重ね合わせ処理』ということでここがこの日のメインとなります。

一応おさらいしておくと、マウスを動かした時にステータスバーに触れるとステータスバーが虫に食われたようになってしまっていました。これを解消するための処理です。今回は一緒にウインドウの重ね合わせ処理もやります。

 

ということでまずどうするかというとレイヤーのようなイメージで管理をするようです。具体的にはウインドウを開くとそれをレイヤー1、マウスはレイヤー2のようにすることで重ねても上手く動作するようにする…ということのようです。

ウインドウを開くとメモリを確保し、新規レイヤーを持ってきます。レイヤーは配列になっていて新規レイヤーを使うとその配列のフラグが使用中になり、高さを指定したら配列内でループさせて順番を決める…のような作りです。ソースをみないとなんともわかりづらいですね…。そしてこんな処理をするとめちゃくちゃ重そうです。

 

重ね合わせ処理の高速化


動作を確認してみると上手く重ね合わせ処理はできていますが、案の定動きが重たいです…。ということで高速化をしていきます(今回はなかなかボリューミー)

ここでは7Pに渡り高速化の説明が書かれています。具体的にはマウスを動かした時の計算範囲を狭めたり、無駄なif文を通らないようにしたりまぁそんな感じです。こういう自分の作ったものをより改善していくのが結構面白かったりしますよね。僕は好きです(今回自分は何もしていませんが…)

なんやかんやで快適に高速化されてめでたしめでたしでこの日は終了です。

10日目の終わりに


ソースは付属のCDに全てついているのでいつでも自分で動かせるのですが、結局本の中で筆者が苦労して改善したものをただ持ってくるだけなのでどうもソースを持ってきて動かそうという気になりません。結構内容は難しいので本を読んでいるだけでも勉強になるのですが、実際にOSが出来上がってくる後半か完成したくらいに実際に動かして自分で改良してみたいと思います。まぁC言語なんでその辺も勉強しなければいけないのですが…。

スポンサーリンク

30日でできる!OS自作入門パート4(9日目)

少し空いてしまいましたが続けていきます。

9日目(メモリ管理)


マウスポインタが一区切りついたので次はメモリ管理です。32ビットモードになってPCの全部のメモリを利用できるようになったので使ってみたいということでこのタイミングで行うようです。

で、まずはメモリがどこまであるかのチェックです。普通はBIOSがチェックしてくれるそうですがBIOSに聞くとアセンブラのソースが長くなったりBIOSのバージョンによって呼び出しを変えなければいけないということでややこしいみたいです。ということで自力でメモリチェックをします(勉強になるなー)。

メモリキャッシュを無効にする


ということでメモリチェックをするためにメモリキャッシュを一時的に無効にします。でないとキャッシュが勝手に反応してしまい上手くメモリチェックができないからです(言われればそんな気がしますね)。で一時無効にしつつチェックをするC言語のソースとアセンブラのソースが記載されております。ふむふむ…。

チェックが上手くいかない?


実際に動かしてみると問題発生。チェックしてみると期待値が32MBのはずが3072MBと表示されます。なんで?

(筆者が)頑張って確認したところ、どうやらコンパイラが原因のようです。コンパイラが優秀過ぎて(?)処理を最適化してしまい結果的に処理が飛ばされ期待値通りにならなかったんですね。

で結局アセンブラで書くことにして無事解決しましたとさ。

メモリ管理に挑戦


ようやく下準備が出来たところでメモリ管理です。現行OSの管理方法をふまえどういう管理方法にするかなど説明があり実装していきます。正直よくわからない部分もありますがちょくちょく筆者が「ここまでの原理がわかっていればすんなり頭に入ってきます」などとあおってきます。そ、そうですね…。

ということで9日目は終了です。

 

ここまでやってみて


自作OSの本を読んでOS作るぜーと言っているくせに、実はLPICの勉強も並行して行っています。一方をがーっとやってもいいのですが、その日の気分でどっちをするかわけているので飽きずに出来ています。

LPICはLinuxのコマンド問題もたくさん出てくるのですがハードの問題もあり、OSの起動方法やMBR、BIOS、ブートローダーとか出てきて結構自作OSで勉強した知識が使えます(windowsとLinuxで違いはあるが)

LPICは今年いっぱいにとれればいいかなと思っているので自分のペースでOS自作と並行して進めていきたいと思います。

スポンサーリンク

30日でできる!OS自作入門パート3(5~8日目)

まとまった時間がとれたため、今日は3日目~8日目を読みました。PCを動かす環境にいなかったため手は動かせていませんが結構読み進めることができました。

3日目(32ビットモード突入とC言語導入)


この日から空のOSを作り『はりぼてOS』という名前で機能を少しずつ追加していくことになるようです。

フロッピーディスクの断面図の絵があり、アセンブラを書いてシリンダを読み込んでみるところからスタートしました。そしてC言語が登場します。C言語は扱ったことはありませんが、今までのアセンブラから比べるとかなり読みやすくなにがしたいのかすぐわかります。

アセンブラからC言語を呼び出すところで3日目は終了です。

4日目(C言語と画面表示の練習)


4日目の目標は3日目で呼び出したC言語のソースでメモリに書き込んで画面表示をすることです。

白い画面を出したり縞模様の画面を出したりしながら進みました。

途中色の設定をしたり四角形を出したりしながら最終的にはタスクバーが表示された画面が出来て4日目は終了です。

この辺まで読んでみて、筆者のノリが『科学読本』ぽいなぁと思いました。

5~8日目


5~8日目は端的に言うとマウスカーソルを動かすのを頑張ります

サブタイトルは

5日目:構造体と文字表示とGDT/IDT初期化

6日目:分割コンパイルと割り込み処理

7日目:FIFOとマウス制御

8日目:マウス制御と32ビットモード切り替え

となっております。

アルファベットを描いて表示したりテキストファイルを読み込んだり、ソースファイルを分割して整理したりしました。ただ主にマウスカーソルを動かすことを頑張っています。

マウスカーソルを動かすために割り込み、スタック、GDT、IDT、PIC、FIFOバッファなど説明が続きます。

GDT、IDT辺りは内容が高度になると筆者が言っていますが初めから結構難しいのであまり気になりません(笑)。

この辺の話は基本情報技術者の勉強をしていたことを思い出しました。

どんどん読み進めてみようと思いました


ここまで読んでみて、まずは読破するのを目標にしようと思います。

全てを理解して進めれば一番いいのですが、現時点で今の自分にはわからないことが多すぎます。

まずは読破してはりぼてOSが出来てから読み返しつつ改良することを目標にしていければと思います。

そういう意味では付録のディスクにソースがついているのはとてもありがたいですね。

30日でできる!OS自作入門パート4(9日目)

スポンサーリンク

30日でできる!OS自作入門パート2(2日目)

2日目(アセンブラ学習とMakefile入門)


2日目になりました。

この日はterapadをインストールし、1日目で動かしたアセンブラのソース説明が主になっております。ということで手を動かすというよりは本を読むという作業ですね。

説明の中に「C言語でいうところの~」という記述がちょくちょくでてくるのですがC言語はわからないので都度調べるようになり理解するのにも時間がかかってしまいます。とはいってもいちいち調べて完全に理解するのを待つと読み終わらないのでほどほどにして進んでいきます。

というより全然知らない世界の話でとんでもない事に手を出してしまったのではないかとちょっと不安…。

30日でできる!OS自作入門パート3(5~8日目)

 

スポンサーリンク

30日でできる!OS自作入門パート1(1日目)

『30日でできる!OS自作入門』という本を買いました。2006年に発売された本で今から12年前の本です。

この本を使ってOSの勉強をすると同時にブログに書くことでアウトプットをしていければと思います。

環境:windows7 64bit

0日(開発を始める前に)~1日目(PCの仕組みからアセンブラ入門まで)


ということで早速作業。まずはHello Worldという文字が表示されるだけのOS(?)を作り起動します。

方法はバイナリエディタで92160行入力(!)しそのイメージファイルをフロッピーディスクに書き込んで実行するという手順。

まずバイナリエディタというものが初体験でしたのでちょっと勉強。本ではbzというツールを使っていましたが動作するのがwindows2000までのようなので『stirling』をインストールしました。

新規で開くとこんな感じです。

ここにぽちぽち入力していくわけですがこれがとても大変….。なので本に付録していた完成ファイルを使用することにしました。ありがたや~。

フロッピーがないのでvirtual boxを使う


次の手順は作った(厳密には付録の)イメージファイルをフロッピーに書き込んで実行するのですが…フロッピーなんてありません。

代替案としてvirtual boxという仮想環境を作成することが出来るツールで起動できるようなので今回はその方法を使いました。virtual boxは仕事でもよく使っているのでよかったです。

virtual boxを開いたら新規で空の仮想マシンを作ります。

とりあえずメモリサイズはそのままいきます。

ここでデフォルトだと『仮想ハードディスクを作成する』にチェックが入っているのですが、今回は『仮想ハードディスクを追加しない』にチェックをします。

仮想マシンが作成されたら『設定』→『ストレージ』と進みます。

緑色の+アイコンを押すとメニューが出てくるので『フロッピーコントローラーを追加』を選択します。

設定が出来たら仮想マシンを起動します。

hello , worldと出力されました!

結局何をやったのか?


本の中でもここまでやってみて何をしたのか解説がありますが、正直よく理解できていません。端的に言うと付録のバイナリファイルをvirtual boxで読み込んだらhello, worldと表示されたということになってしまっています。

アセンブラとかバイナリファイルとか自分にはあまりなじみのない単語が出てきているので1日目が終わった段階で少し調べつつ勉強中です。

ただいつまでも1日目にいても仕方がないのでふわっとはしていますが進んで行きたいと思います。

30日でできる!OS自作入門パート2(2日目)

スポンサーリンク