[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 1899] 今月の予定.



  こんにちは、川合です。

  今月ももう半分を過ぎました。ChannisやLeMansのリリースが始まら
なければいけない時期なのですが、なかなかはかどりません。

  7月ほど暑くはないんですが、どうも体力を今までの暑さで消耗して
しまったらしく、linkset0を書いただけで結構疲れてしまいました。

  その上、どうもうちのハードディスクの寿命が迫っているらしく、少
々不調です。このハードディスクももう3年以上使っているので、そろ
そろ買い替えようと思っています。

  今月はオフ会もあり、実はもうあまり時間がないような気がしていま
す。

  さて、その残された時間で何をやるかですが、今のところ、以下を予
定しています。

1.DLL機能を追加してChannisやLeMansということにする。
2.linkset0を一般公開。
3.introシリーズを改定。
4.vectorにOSASK ver.1.5を登録。

  このうち2.〜4.はそんなに面倒なことではありません。いや、1
.もたいした機能ではないので付けるのは簡単なんです。しかし・・・
。

  ASKAを使ってDLLを書き、ASKAで書かれたアプリケーションからDLLを
呼び出すということなら、ええ、それは至って簡単です。元気があれば
1日でできてしまいそうなくらいに簡単です。しかも、ASKAはfarポイ
ンタを自由に使えるので、制限らしい制限はほとんどありません。

  問題は、lcc-win32でDLLを書くとか、lcc-win32でDLLを呼び出すとい
う場合です。これをサポートする方法を一晩考えました。今のところ一
番現実的なのは、linkset0をさらに拡張して新しいオプションを搭載し
、必要に応じて単なるリンク以上のことをやるようにすれば、不可能で
はないと考えています。

  <アプリケーション側>

  /* DLLをリンクするための一連のコードを書いたあと、 */

  ret = dllfunc(magic_code, param1, param2, ...);
  /* 関数名は自由に決められる */

  <DLL側>

  int dllfunc(const int CS, param1, param2, ...)
  /* 関数名は自由に決められる */
  {

  }

  ソース上の難点は、呼び出し側もDLL側も、第一引数に訳の分からな
い値が出てくることです。呼び出し側の注意点は、magic_codeは変数で
あってはいけないということです。これは定数整数式で、その値はDLL
のリンク方法で決まります。また、DLL側では、staticな変数を全く利
用できません。もちろん文字定数も不可です。・・・しかし、これはそ
れなりの代用方法があり、それを使えば少々面倒な思いをするだけで済
むでしょう。

  こんなに制限が残っているくせに、それでもlinkset0の拡張は結構面
倒なのです(そりゃあ、まあ、コンパイラがサポートしていない機能を
リンカの拡張で補おうというんだから、大変なのは当然なのですが)。

  コンバーターが実際にやることは、DLL側では、バイナリーを解読し
て、near-returnをfar-returnに置換することです。一方、呼び出し側
では、

    PUSH(magic_code);
    dllfunc();

の10バイトを見つけ出して、

    DB(0x9a); DD(func_addr); DW(magic_code & 0xffff);
    ESP -= 4; /* スタックの高さをごまかすため */

の10バイトに交換することです。

  ・・・まあ、こういう具体的なことはともかく、とりあえず、C言語
からDLLを利用できるようになるのは、今月中に達成できそうにないだ
ろうということで、勘弁してください。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/