はりぼて日記
2007 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 10
2006 | 11 | 12
10月 10 (水曜日) 2007
13:26
22日目
 
22日目〜。

さらにOSを守る。

P446
ふーむ・・・
IN・OUT命令はアプリからは使えないと。(使えるようにすることもできなくはないよう・・・)

そう考えると、ドライバなどはどう考えたらいいのかな?
ドライバはアプリとすることは出来ない。(上記の理由で)
ということは、ドライバはOS側ということになるのかな。
Win等の市販のOS(サードパーティーがドライバを提供するのが
当たり前になっているOS)ではどう考えているんだろう???

P449
黒川合退散〜 (笑
アプリ作成再開!

P451
・・・むむむ!??
あれれ? これけっこう重要and知らなかったかも?
C言語で配列を宣言した場合、それはメモリではなくスタック内に設定される(まあスタックも、メモリっちゃあメモリだけどそこは分けて考える)
っていう理解でいいのかな???
普通の int a; とかはどうなんだろう?
こっちはメモリなのかな???


P453
うーむ。おもしろいなぁ。
割り込み発生時に各レジスタの値も表示すると・・・
(今思うと、OSASKのバグ表示もこれだったのかな)

P458
・・・あれれれ?
例の6バイトのことだ。あっれーー? なんか見落としてる?

ちょっと戻って整理してみよう。

  • P424。アプリの頭6バイトを書き換えないといけない。なぜ?
  • アプリの本体(実行コード)の前で0x1bをコールしなくてはいけないから。なぜ?
  • .hrbという実行ファイル。プログラムそのものが先頭から始まっているわけではない。先頭0x00〜0x1aまではプログラムではないのだ。なぜ?
  • ・・・コンパイラの設定or仕様なのか???・・・
  • とにかくメモリにロードされたアプリは0x1bからコードがスタートする。なので、そこをコールしなくてはいけない。なぜコール?
  • RETFしないとこのアプリを呼び出したコンソールに戻れないから。なのでgotoではなくcallして、戻ってきた次の場所でRETFしている

・・・ふむ!! とりあえずこんな理解でいいのかな。
で!!!


  • P441。いままではRETFをかけることで、アプリにジャンプ
    してきたコンソール(OS側)に戻ることができた。
  • いままではアプリもOSのセグメント内(OSと同じ権限を持つ別のセグメント)で動いていたのでRETFが使えた。なので使い、ちゃんと戻ってきた。
  • セグメントをアプリ用に設定してしまったのでこれでは戻れない。終了してコンソールに戻るにはそれ用のAPIを呼び出す形を取る。



  • P458。もうRETFでは戻れないOSとなった。不要。
  • なのでstart_appで書き換える必要はない。直接そこへジャンプすればアプリはスタートする。
  • 逆に言えば、以前はRETFをする必要があったのでstart_appで直接コールすることが出来ないorそれじゃ足りないと。


・・・こんなところかな???・・・・・・



P459
ふむ・・・・このあたりから、.hrb(実行ファイル)の内部構造が
解説されてるね。
なるほどなぁ。実行ファイルって、ただ最初からベターっと
プログラムが書かれているわけじゃないんだね。
また、なんのためにそういう仕組みになっているのかもこれを
読むと良くわかる。
ついでに、なぜ、先の6バイトで0x1bをコールしているのかも
ここで解説されとりますね。


P463
へえぇぇ。
.textと.dataかぁ。なんかややこしいですねぇ。
(まあ紛らわしいってのはもう、しょうがないんでしょうね。)

P465
へえぇぇぇ! こりゃおもしろい!
PUSHとPOPって別に絶対的なことじゃないんですねぇ。

ん??? あれぇ?
P466のwinhelo.cのソースでapi_openwinからの戻り値を取ってる。(int win)
ここには何の数値が入る?。どこでその処理をしてる???
もしかしてCとアセンブラの連携だったっけ?。ちょっとメモを見よう・・・

えーーーっと!
Cからアセンブラの関数を呼んだ場合、パラメータが左から順に、
[ESP+4]、[ESP+8]、[ESP+12]・・・と格納されると。
さらに、アセンブラ内ではEAX・ECX・EDXしか使えないと。
(P466のa_nask.nas内では使っているが、やっぱり本来は使っちゃいけないレジスタなので、EDI・ESI・EBXをスタックに退避させ、API割り込み呼び出し後にPOPして復元してから終了してるわけ)
・・・あ”こっちかぁ。
P465のconsole.cのほうかぁ。

あーーー! なんかちょっと読み飛ばしてたみたいだ!

P464でちゃんと、EAXに戻り値が設定されて帰ってくるってことにしてるんじゃん!


  1. Cのアプリであるwinhelo.cから api_openwin がコールされる。
  2. api_openwinの中身はバッファの整理。パラメータをレジスタに設置してINT 0x40し、割り込みを発生させる。
  3. 発生したのは割り込みであるので、OSがそれを検知して割り込み処理を行う。
  4. 0x40の割り込みが発生した場合の動作はIDTに設定されている。asm_hrb_apiが設定されているのでここに制御が移る
  5. asm_hrb_apiはレジスタを保存。さらにDSやESをOS用に切り替えてhrb_apiをコールする
  6. hrb_apiは動作を行う。

  7. 動作を終えると、逆順で戻っていく



えっと。これを踏まえて・・・
 
30日を過ぎたBlogにはコメントできません。

Referer  (1)
(1) 2 3 4 5 6 7 8 9 10 » 

PopnupBlog V3 Denali created by Bluemoon inc.