[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 1884] from OSASK BOARD
このメールは、OSASK伝言板に書き込まれた内容です。
この書き込みに返事を書く場合は、下のURLから書き込みを行なって下さい。
http://www.imasy.or.jp/~mone/osask/index.cgi?REFER=3b7476a5_16dee
From: 川合秀実
Message-ID: 3b7476a5_16dee
Date: 2001/08/11 09:04
Subject: Re: 細部とか
>>>1.(アセンブラで)使いにくそう
>%macro msgbox 4
> mov dword [cmd],msgbox_cmd
> mov dword [param],%1
> mov dword [param+0x4],%2
> mov dword [param+0x8],%3
> mov dword [param+0xC],%4
> mov dword [param+0x10],0x00000000
> mov EBX,cmd
> call far SYSTEM_CALL
>%endm
もちろんこのマクロでもいいですが、少々コードが長くなる傾向にあります。
僕が想定している利用方法は、基礎データーを構築しておくか、もしくは、
%macro msgbox 4
push dword 0x00000000
push dword %4
push dword %3
push dword %2
push dword %1
push dword msgbox_cmd
mov EBX,ESP
call far API
add ESP,24
%endm
というものです。Windowsと比べるとEBXの代入の分だけ手間が増えていますが、
このわずかな代償を払うだけで、大量の基礎データーを最初からddで並べておい
て、それを呼び出すということも可能になっています。実際にアプリケーション
を書いてみると、パラメーターの大半は可変ではないことが多く、基礎データー
を並べておいて呼び出すことの方が多いです。
>>>2.(Windowsに比べて)キャッシュミスがごくわずかに増えそう
>いや、これはスタックにアクセスが集中しないので、DSとSSでそれぞれにキャッシュミスを引き起こす可能性がある、
>という、どう考えても気にならない程度のもののことですので、気になさらないでください。
上記のマクロを使えば、Windowsとの比較で不利とは言えないでしょう。また
基礎データーを用意しておいた場合、結果的にかなりのpush命令が削減され、コ
ードがコンパクトになります。このコンパクトになった分だけキャッシュの負担
が減って、キャッシュミスは減るのではないかと思われます。
>>>3.ユーザがシステムワークエリアを指定するのはちょっと・・・・
>う〜ん。触ることのできないものをいちいちユーザが指定するわけですか・・・・
>この方法の利点が今一つ思い当たりません。
>それより、ユーザのメモリ空間を2GB程度に制限して残りをワークエリアにしてしまったほうが
>ワークエリアへのポインタを保持しなくてすんでいいような気もします。
利点はあります。・・・しかしまず、欠点はたいしたことではないということ
から指摘させてください。ワークエリアの位置を最初に指定するのがちょっと面
倒なだけです。最初にそれをやってしまえば、あとは気にしなくていいんです。
ご指摘の方法は、僕も考えました。しかしその方法はポインタを保持しなくて
済む代わりに、全てのタスクに異なったページング空間を用意しなければいけま
せん。Windowsではタスクごとに4GBのページング空間が割り当てられるようです
が、OSASKでは必ずしもそうではありません。もし、アドレス空間が1MB程度あれ
ば充分というアプリであれば、そういうアプリは他のアプリと同じページング空
間に置かれるでしょう。もちろん、セグメンテーションによって、それらは決し
て干渉することはありませんし、自分の空間はアドレス0から始まっているよう
に見えます。
この手法により、タスクスイッチが発生してもページ空間が切り替わらないこ
とが多く、TLBキャッシュのヒット率が上がり、またページテーブルの数も結果
的に減少しています。また必要なら2GB以上の領域を自由に使えるのです。
>あ〜、どっかにasm並みにコンパクト&高速&細部制御可能なコンパイラないですかねぇ。ああ、他力本願だ。
>作るか・・・・・・( ゜゜?
ありますよ。我々が使っているASKAというものです。これは結局アセンブラな
のですが、書き方がかなり違います。ちょっと宣伝させてください(笑)。
アセンブラで、
looplabel:
mov EAX,[ESI]
add ESI,4
mov [EDI],EAX
add EDI,4
dec ECX
jnz looplabel
などというコードを書くことがありますが、ASKAではこれをこう書きます。
do {
EAX = [ESI];
ESI += 4;
[EDI] = EAX;
EDI += 4;
ECX--;
} while (!= 0);
さらにASKAっぽく書けば、こんな風にも書けます。
do {
int *src == DS:ESI, *dst == DS:EDI;
int count == ECX, tmp == EAX;
tmp = *src;
(offset) src += 4;
*dst = tmp;
(offset) dst += 4;
count--;
} while (!= 0);
結局はアセンブラなので、コンパイル後に出てくるコードは上記例と1バイト
も違いません。
OSASKの大半はASKAで書かれています。ASKAなしであれを書けといわれたら、
かなり滅入りますね(笑)。