*目次
#contents
*思いついただけの単なるアイデアとか。
**問題1:全てのHaribote系OS上で動くアプリケーションの互換性について(APIの番号とか。)
***今の実装
-読破し、新しく機能を追加していく段階あたりと仮定。
***今日の考察
とりあえず[[advance/osselect]]あたりを読んでみた。~
でもOSが変わってもその上で動作するアプリは書き換えがまったく無いのがいいよなぁ。~
でも現状としてはあっちでFDの読み込みがこっちでBEEP音を鳴らすとかだったりしそうだし、どうすっか。~
***思いついたアイデアについてのまとめ
アプリ側を変更することなく、任意のHaribote系OSで動かすことが目標です。~
これを実現する方法は大きく3種類思いつきます。~
-アプリが大量のOSについてデータベースを持って、OS毎に実質違うコードを使う。
-全てのOSが、アプリが最適化した対象の任意のOSについてデータベースを持って、エミュレートする。
-アプリが望んだ関数の関数番号を何らかの一定した方法でOSから取得して、以降は取得した関数番号を使いまわす。
1つめと2つ目は「とても小さい実行プログラムが作れる」「手軽にOSを作れる」等の観点から論外だと思うので省略します。~
3つ目の方法は、プログラムで表現すると例えば次のようになります。~
プログラム側
mov eax,offset funcname ;関数名。「ゼロ終端ASCII文字である事」等の取り決めが別途必要。
mov edx,0xffffffff ;検索用の関数番号。必ずしもこの値でなくても良いが、とりあえず例。
int 0x40
;returns
;eax : 呼び出し方法。0の時はHariboteOS標準形、等
;edx : 関数番号
db funcname "api_linewin",0
OS側(前後他色々と省略)
int* hrb_api( ... ){
...
if(edx == 1){
...
}else if(edx == 0xffffffff){
if(strcmpS(eax,"api_linewin")){//strcmpS(char*str1,char*str2);はstrcmpの特殊版。
//アプリのデータセグメントにおけるstr1とOSのデータセグメントにおけるstr2とを比較する。
//勿論アセンブリで実装する必要がある。引数が足りないかもしれない。
(&eax)[8]=0;
(&edx)[8]=13;//こいつらは_asm_hrb_api内のPOPADでレジスタに代入される。
}else if(strcmpS(eax, ... )){
...
}
}...
...
}
return 0;
}
*このページの履歴
-2009年03月10日 - 出現(問題1)
*コメント
-毎度のことながら面白いですね(API番号)。僕としては現状ではこのアイデアを支持するわけではありませんが、しかしいろいろと比較検討する価値はあると思います。 -- [[K]] SIZE(10){2009-03-11 (水) 21:57:19}
-毎度のことながら面白いですね(API番号)。僕としては現状ではこのアイデアを支持するわけではありませんが、しかしいろいろと比較検討する価値は十分にあると思います。 -- [[K]] SIZE(10){2009-03-11 (水) 21:57:19}
#comment