はりぼて日記
2007 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 10
2006 | 11 | 12
12月 29 (金曜日) 2006
18:50
九日目3
 
九日目 [4] 終了〜。



なーるほどなぁ。メモリ管理。思えばこんなのは、OSならではの考えかただよね。



これは究極だけど、OSが特定のソフトをたった一個だけしか動かさない、なにか専用だったら話は簡単だよね?



0x00000000〜0x100000000はOSが使う。あとは好きにしてくれ!



なんてことも可能だしね。

ところで妄想だけど、この管理部分がもし私の想像通りに使われるのだとしたら、たとえば「メモリデフラグ」みたいなのを実装できないかなぁ。ほら、たとえば「メモ帳」みたいなソフトを動かしていて、こいつが現在 0x00001000 〜 0x00002000 を使っているとするじゃない?。で、急に「画像編集ソフト」を使いたくて、どうしても連続して 0x00000500 〜 0x00030000 を使いたいなんてことが起きた場合、ソフトの使われ方や頻度を判断して、一瞬メモ帳を凍結させておいて、メモ帳が使っている範囲を0x00031000 〜 にメモリコピーして再び動作を再開させるとか。

 
name: @Guest  Comment:
16:39
九日目2
 
九日目 [3]



え”〜???

なにこれ? 最適化? それによって、やってほしい処理がすっ飛ばされることがある?。

ひえー。そんなことがあるの? 知らなかった。

 
name: @Guest  Comment:
16:34
九日目
 
九日目 [1]〜[2] 



メモリ管理かぁ。ええと? 自前の「メモリ総容量チェック」とな?

へー。そんなこと、考えもしなかった。なぜこんな処理を?



例えば、16bit時はBIOSが使える。OS-WikiのBIOSのページを見るとそれらしいものもあるしなぁ。これじゃ不十分なのかな??

なになに? このBIOSコールの戻り値(つまりメモリの量)は、AXレジスタに入ると。そうするとAXレジスタは16bitだから、最大0xffffまで。(10進数では65535)さらに、単位がKBと。65535KBってことはええと・・・あれ!! 64MBくらい?



あっちゃ〜。そうかぁ。BIOS(16bit時)じゃ、64MBまでしか教えてくれないんだ。だから、もしBIOSで確認しようって場合にはなんかメーカー独自の拡張BIOS?とかでないといけないわけね。だから本では「いろいろ違うといやだから」と書いてあるのかぁ。なーるほどぉ!!!



プログラムの理屈は解ったんだけど、「なぜそれを自前でやらなくちゃいけないのか?」が解らんかった。なるほどねぇ。

 
name: @Guest  Comment:
16:03
八日目2
 
八日目 [5]。



ふむふむ。ここで積み残しの解説である「32bitモードに移行」が説明されているのか。なるほど。いろいろと細かい説明があるが、32bitへの切り替えは、まず



 ・全ての割り込みを一旦禁止する。

 ・KBCのおまけ回路(A20GATE)に命令し、1MB以上使えないようにしてあった関所に、「開門〜」をさせると。

 ・さらにCR0レジスタに値をセットすると、保護付き32bitに切り替わる



簡単に言えば、こういうことだね。

で、単に切り替えただけだとセグメントレジスタの使い方が変化してしまうので、これのつじつまを合わせるための処理をすると。



で、最後の処理。これまでは16bitなので、0x0000 〜 0xffff までしかメモリを使えなかったと。(当然これまでは、この範囲内であれこれやり繰りしてた)

しかしこのほど、めでたく32bitになったので、こんな狭い範囲よりもっと大きな範囲が使えるようになったので、そこにメモリの内容をコピーしちゃうわけね。





ここで四日目に生じた私の疑問は解けた。(っというか、確認できた。)

i386CPUは、16bitから32bitに切り替わっても、それまでのメモリの内容は破壊されずにそのまま残っているのか!。つまり、



 ・起動初期。まだ16bit。メモリは0x0000〜0xffffまでしか使えない

 ・この時に、仮に0x1000番地に「20」を代入しておいたとする。

 ・上記いろいろをやって、32bitに移行完了!

 ・メモリは一気に 0x00000000〜0xffffffffまで使えるようになる。(搭載されていれば)

 ・で、このとき 0x00001000番地の値を見ると、やっぱりちゃんと「20」であると!



こういうことでOKのようだ。なるほどねぇ〜。



PS:

こうして見ると、下位互換が宿命とはいえ、インテルのCPUはほんとに複雑でややこしい作りになっているんだなぁと生意気な感想が。

歴史にifは禁物だけど、もしインテルが8086との互換を無視して最初から32bitのCPUを設計し、それが当たっていたら、もっとずっと解りやすくて整合性がとれたものになっていたんだろうなぁ・・・



 
name: @Guest  Comment:
Referer  (1)
14:17
八日目
 
八日目 [1]〜[4] 終了〜。



あれ〜。いまさら気が付いたが、このマウスを動かすっていうプログラムが、もうほとんど「単なるC」で完成してる!



複雑・煩雑なハードウェアの制御と、それを行うアセンブラを関数化して追い出しているからこそなんだなぁ。

私はCはあまり得意ではないけど、164Pのこのソースはなるほどなるほどと読むことができた。おもしろ〜い。



ところで、マウスがタスクバーにかかると崩してしまうというこの動作。いまさらだけど、元来コンピュータにとっては「透明色」なんてものは存在しないんですねぇ。(いろんな高級言語上では、あったりまえに使われているものだけど、あれを支える内部プログラムはどうなってるんだろ? 例の論理演算とかを使うのかな???)
 
name: @Guest  Comment:
Referer  (1)
13:58
七日目2
 
七日目 [6]〜[7]。終了〜。



おー! ここはなんか、比較的ツルっと読めたぞ?

なるほどなぁ。周辺機器(今回はキーボードとマウス)からやってくる信号は基本的にはこういうパターンでOS側で受け取るのかぁ。



あとはこれらやってきた信号に対してどう反応させるか?というプログラムかな。



え”もう寝ろって?

・・・いや、そういわずに八日目に・・・(^^;
 
name: @Guest  Comment:
12:44
七日目
 
七日目 [1]〜[5] 終了〜。



おもしろい。ここは私でもなんとかプログラムを追うことができた。

パソコンの世界ではよくこの「バッファ」というものが出てくるよね。なんに使うか、どう動作するか。その理屈はわかっていたんだけど、こうキチンと説明してもらうとよくわかる。



ところでちょっと思ったのだが、このプログラムではバッファを使ってキーボードからの「割り込み通知&押されたキー」の情報受け取っている。そしてさらに別の関数でそのバッファをチェックして、実際の文字表示を行っている。つまり、二重に見張りをしている。なぜこんなことをするのかというと、書いてある通り文字表示は時間がかかる処理だから。



これを私なりの理解で図化するとこういうことになるのかな?







     ┌ 1秒に10回見張る ─┐ ┌ 1秒に1000回見張る ─┐

     │          │ │           │

     │このくらいの頻度で │ │これくらい見張らないと│

画面表示←│十分        │←│取りこぼす可能性がある│←キーボード

     │          │ │           │

     └──────────┘ └───────────┘

       文字表示ルーチン       バッファ







なるほど。この考えを拡張していけば(たとえばこの段階ももっと何重にも増やしたりとか)していけば、高速なデータや割り込みをうまく処理できる? のかな???

 
name: @Guest  Comment:
11:53
六日目4
 
六日目 [6]。 これで六日目は終了〜。



・・・わー。だめだ。たしかにここは難しいよぉ!



プログラムの細かい理解はちょっと置いておこう。基本的な内容だけにしておいて2巡目に期待・・・



ここの内容は、

 ・IDTの各割り込み番号部に実際に動く関数のアドレスを当て込む

 ・割り込み処理は文字通り「割り込み」。なので、処理が終わった元に戻す必要がある。

 ・なので、各レジスタをバッファに退避させ、処理が終わったら丸ごと元に戻して終了する



こんなとこでしょうか。

 
name: @Guest  Comment:
12月 26 (火曜日) 2006
10:03
六日目3
 
六日目 [5] 終了〜。



・・・うむむ。たしかにここいらへんはむずかしいなぁ。

でも、この本はできるだけ説明をしようとしているのでそう見えるだけかも。少なくともこのセクションは、



・IDTを設置して、割り込みを受け付ける準備をしたぞ〜。

・CPUの割り込み受付ピンは一本しかないので補助の回路が付いてる。

・補助回路を初期設定しないといけないんだぞ〜。

・補助回路はPIC0、PIC1の二つあるぞ〜。

・まずはPIC0、PIC1に、「初期化中だから一旦全ての割り込みを禁止」にさせろ。(IMRの設定)

・PICの設定開始!

・IPC0、PIC1には四つの設定項目がある。(ICW1〜ICW4)

・ICW1、ICW3、ICW4は、まあ特殊なことしないなら普通は決まった値を設置する。

・で、肝心なのがICW2。つまり、これで「割り込みが来たら、どこを見ればいいか?」と設定する。

・IPC0(割り込み0〜割り込み7を担当)には、「割り込みがきたら0x20〜0x27を見ろ!」と設定。

・IPC1(割り込み8〜割り込み15を担当)には、「割り込みがきたら0x28〜0x2fを見ろ!」と設定。

・割り込みの設定ができた〜! 割り込みの受付を再開していいぞ〜(IMRを再設定)



・・・とまあ、こういうプログラムなわけね。なるほど〜。
 
name: @Guest  Comment:
Referer  (2)
09:32
六日目2
 
六日目、[4]。



なんと中ボスらしい!

(ところでアナタにとって中ボスといえばなに!? 私の場合はやっぱりフドウミョウオウだったりします。←メガテンマンセー)



うーむ。これはようするに、前回出てきたGDT表。この表の各項目の設定方法の説明だな。



 ・セグメントの大きさ

 ・セグメントの開始番地

 ・セグメントの属性



この三つで一つの行になっているわけか。その理屈自体はまあ、よくわかるな。



・・・で、問題点。なるほど。過去の資産(80286)との互換性を維持するために、えらくややこしい(むずかしいというよりは)方法でないといけないんだな。(インテルのCUPが嫌いだっていう人は、こういう部分に泣かされた人達かな???)

たとえばだけど、そういうちょっとヘンテコな仕様じゃなかったら、きっとこんなんでいいはず。





struct SEGMENT_DESCRIPTOR {

dword *base; ;ベースアドレス用。番地なので32bit

dword limit; ;0〜4GBまでなので32bit

short access; ;12bitだけ必要だが16bit

};







base、limit、access。おのおの設定に必要な数値から考えるとこれで十分なはずだけど、実際にはCPUがややこしい仕様になっていて、数値を別々に割って設定しなくてはいけないって感じかな??

 
name: @Guest  Comment:
2 3 4 5 6 7 8 9 10 11 (12) 13 14 » 

PopnupBlog V3 Denali created by Bluemoon inc.