page0011
の編集
http://osecpu.osask.jp/wiki/?page0011
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
BracketName
FormattingRules
FrontPage
Fulyn
Fulyn-v2
Fulyn_Samples
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KOR_PIT8254
KWVM.NET
Liva
MANA
MenuBar
OSECPU_FPGA
PG_MANA
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
hikalium
hikarupsp
hikarupsp_ELCHNOS
hikarupsp_ELCHNOS_IDE
hikarupsp_FrontEndCode
hikarupsp_WebCPU-VM
hikarupsp_WebCPU-VM_internal
hikarupsp_study_hh4
impressions
impressions0000
jpag0000
jpag0001
jpag0002
jpag0003
jpag0004
jpag0005
lambdalice
mandel59
members
memo0000
memo0001
memo0002
memo0003
memo0004
memo0005
memo0006
memo0007
memo0008
memo0009
memo0010
osask
osecpu4android
page0000
page0001
page0002
page0003
page0004
page0005
page0006
page0007
page0008
page0009
page0010
page0011
page0012
page0013
page0014
page0015
page0016
page0017
page0018
page0019
page0020
page0021
page0022
page0023
page0024
page0025
page0026
page0027
page0028
page0029
page0030
page0031
page0032
page0033
page0034
page0035
page0036
page0037
page0038
page0039
page0040
page0041
page0042
page0043
page0044
page0045
page0046
page0047
page0048
page0049
page0050
page0051
page0052
page0053
page0054
page0055
page0056
page0057
page0058
page0059
page0060
page0061
page0062
page0063
page0064
page0065
page0066
page0067
page0068
page0069
page0070
page0071
page0072
page0073
page0074
page0075
page0076
page0077
page0078
page0079
page0080
page0081
page0082
page0083
page0084
page0085
page0086
page0087
page0088
page0089
page0090
page0091
page0092
page0093
page0094
page0095
page0096
page0097
page0098
page0099
page0100
page0101
page0102
page0103
page0104
page0105
page0106
page0107
page0108
page0109
pagenames
populars
seccamp2013
seccamp2014
seccamp2017
ttwilb
ttwilb-asmi
yao
* OSECPUのQ&A -(by [[K]], 2013.03.21) ** 毎度のQ&A形式による説明 -''(1) 仮想CPU関係'' -(1-1) どうしてレジスタが64本もあるの?多すぎじゃないですか? --x86の32bitモードは8本しかないですし、他のプロセッサでも16本程度のものが多いので、確かにこれは多く見えます。その疑問はもっともです。 --でもOSECPUでは、メモリへのアクセスはいろいろとセキュリティのためのチェックを伴うので、遅いのです。そうなるとできるだけレジスタだけで処理をしたいという気分になります。だからレジスタを増やしました。 --一方で、レジスタを256本とかにしてもたぶんそんなに使いきれず、結局将来タスクスイッチ(コンテキストスイッチ)のオーバーヘッドが増えるだけになりそうなのでやめました。 --それにOSECPUの命令では、演算命令や比較命令で定数を指定することができません。「1を足す」とか「0と比較する」みたいなことができず、他のレジスタに事前に定数を代入しておいて、そのレジスタとの比較にしなければいけないのです。こんな仕様なのでレジスタは多そうに見えて実はそんなに多くないかもしれません。 --どうしてそんな命令の仕様なのかと言えば、それはJITコンパイラを単純化するためです。 -(1-2) どうしてレジスタマシンを採用したのですか?JIT前提のバイトコードって、スタックマシンが多いと思うんですが。 --うーん、まあ、作者の趣味・・・かなあ。もしあなたがスタックマシンを好きなのでしたら、それでOSECPUみたいなOSを構成してみたら面白いかもしれないですね! -(1-3) どうしてポインタに対してはこんなに厳しいチェックがあるのに、整数値については無頓着なの?0x7fffffffに1を足したら負の数になってしまうけど、これは明らかにおかしいよね? --確かに明らかにおかしいです。しかし整数演算までチェックを厳しくするとさすがに速度が落ちてきそうで心配です。それに計算の結果おかしな値になっていたとしても、それは計算をさかのぼることで原因を突き止められる場合が多いです。しかし一方、ポインタがおかしくなった場合は悲惨です。オブジェクトがあらぬ値で上書きされて、もう何が何だかわかりません。ということで、ポインタのチェックは省略しません。 --整数値については、想定している上限と下限だけをチェックすればいいかというとそうではない場合もあります。5の倍数しかありえないとか、1桁かもしくは5桁の数字になることが期待されているとか、その変域もかなり変則的です。そうであれば、自動のチェックはあまり役に立たないかもしれないので、CPUとしてはチェック機構を持ちません。しかしプログラマはそれらのルールをちゃんと反映してチェックしてください。そしてチェックコードを適切なアサートレベルのブロックに入れておいてください。これで翻訳時にどこまで反映させるかを選択することができます。 -(1-4) Pxxっていうレジスタは何?ポインタレジスタ??実際の値を参照したり表示したりできないって本当? --はい、ポインタレジスタです。何か値が入っていることは間違いないのですが、そして限定的に値を比較することもできるにはできるのですが、それ以外のことができません。「結局アドレスはいくつなのか?・・・分かりません」「定数を入れたいんだけど?・・・入れられません」でもポインタレジスタ同士の代入はできるので、値を伝えていくことはできます。またポインタ型のメモリに格納することもできます。でもそのメモリ内容はポインタ型以外にはキャストできないので、やはり具体的にどんな値が入っているのかを知る方法はありません。 --そもそもポインタレジスタもポインタ型のメモリも、何ビットであるのか明らかにされていません。結局何ビットでもいいのです。どうせ直接値を参照することがないので。たぶん将来的に何ビットにするかは前後していくと思います。 --ちなみにポインタレジスタという名前にもかかわらず、ポインタ以外の使い道もあるレジスタです。ファイルハンドルみたいに、他の値と間違えたら困るけど、その値そのものを見たり加工されたくない場合に、このPxxを使うことができます。その場合、ハンドルなのでメモリアクセスには全く使えません。 -''(2) アクセス制限関係'' -(2-1) OSECPUのアプリって、システムからメモリがもらえないって聞いたんですが本当ですか!?信じられません! --APIで、メモリくださーいって言うことはできません。こう考えてください。あなたは今からお使いに行きます。その時にお金を渡されます。だからその範囲で買ってきてください。十分に買えるはずです。無制限に使えるクレジットカードは渡しません。これがOSECPUのリソース管理の考え方です。 --アプリは起動時に引数でリソースを受け取ります。足りなくなっても誰も助けてくれません。また、自分の子分(ライブラリ)を使う場合には、あなたが持っているリソースを切り分けて渡します。子分だってリソースがなければ生きていけませんからね。 --現在の、好きなだけmallocできてしまうプログラミングスタイルは、明らかにクレジットカードを渡す方法です。メモリを食いつぶそうという悪意あるプログラムがいたらどうなりますか?みんな巻き込まれてしまいますよね?信用できない相手にクレジットカードを渡しますか?OSECPUは下請けの外部プログラムを基本的に信用しないのです。リソースは先払いで渡しますから、その範囲内でやってください。1000円で1500円の物を買ってこいとか、そんなことを言っているわけじゃないです。問題なくできるはずです。自分で自分のメモリの管理ができないような人は、OSECPUでは生きていけません。 -(2-2) もらったメモリを超えて使うことはできないんですか? --できません。やろうとしたら強制停止させられます。だから続行できません。 -(2-3) 子分は私のメモリを自由にアクセスできてしまうのですか?OSはアクセス制限によってアプリから自己を守っているようですが、アプリはアクセス保護によってライブラリ関数のバグから自己を守ることはできないのでしょうか? --できます。任意のポインタにアクセス域を設定できます。ただし、これは自分が持っているアクセス域よりも広くすることはできません。同じか小さくすることしかできません。これにより、ライブラリのバグから自己を守れます。 -(2-4) OSは追加のメモリをくれないだけではなく、アプリに時間の制約があるって本当ですか? --正確には時間ではなく、実行可能な命令数です。だから無限ループになったり、もしくはあまりにものろのろとやっていると、何の悪事を試みていなくても、勝手に止められてしまいます。時間ではないのでマルチタスクになっても動作可能量に影響はありません。PCの性能差があっても影響をうけません。・・・これもメモリと同じように、起動時に与えられていますし、ライブラリを使うのならライブラリにも分けてあげなければいけません。 -(2-5) ディスクにも制約はありますか? --あります。ディスクというかファイルシステムですね。まずパスはルートから記述することができません。OSが渡したカレントディレクトリに対する相対パスだけです。しかも親をたどることができません。さらに容量制限もかかっています。ライブラリにパスを渡すことができますが、その場合はライブラリも同じ制約を受けます。つまり、アクセス域は下位に行くにつれてどんどん小さくなっていくのです。 -(2-6) ライブラリが上記のいずれかの制約を守れずに停止させられてしまったら、呼び出し元であるアプリも停止させられてしまうの? --何も設定してなければそうなってしまいますが、もし適切なハンドラを登録しておけば、子分が引き起こしたエラーでアプリが停止しないで済むようにできます。これはもともとはプラグインの暴走から本体アプリを守るためのものです。しかしこのハンドラは自分より下位のものにしか有効ではありません。自分自身のエラーをハンドルすることはできません。 -(2-7) OSは基本的にすべてのアクセス権を持っているわけですよね?じゃあAPIをうまく使ってだませばいいのかな? --OSはアプリよりは広いアクセス権を持っているかもしれませんが、すべてではないと思います。OS自身もそれを切り分けてアプリを呼び出しているわけです。それで、OSをだます作戦についてですが、OSECPUにはカーネルモードとかスーパーバイザーモードがあるわけではなく、つまりは常にアクセス制限を受けています。言い方を変えればアプリもOSと同じモードで動いています。・・・あなたはシステムコールに際して、不当に広域なポインタをパラメータに書かなければ、OSに悪事を代行させることができません。でも、そのような広域なポインタをどうやって作るのですか?というかそれができるのなら、わざわざOSを使わずとも目的は達せられるのではないですか? --モードがない(モードの切り替えがない)ということは、モードを切り替えるためのパスワードみたいなものも必要ないということです。rootパスワードとかそういうものはOSECPUとは無縁です。・・・OSは特権を有し、非常時にはアプリにもその特権を与えられるような仕組みしたUNIXだからこそ、典型的な攻撃が成立していたのです。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
タイムスタンプを変更しない
* OSECPUのQ&A -(by [[K]], 2013.03.21) ** 毎度のQ&A形式による説明 -''(1) 仮想CPU関係'' -(1-1) どうしてレジスタが64本もあるの?多すぎじゃないですか? --x86の32bitモードは8本しかないですし、他のプロセッサでも16本程度のものが多いので、確かにこれは多く見えます。その疑問はもっともです。 --でもOSECPUでは、メモリへのアクセスはいろいろとセキュリティのためのチェックを伴うので、遅いのです。そうなるとできるだけレジスタだけで処理をしたいという気分になります。だからレジスタを増やしました。 --一方で、レジスタを256本とかにしてもたぶんそんなに使いきれず、結局将来タスクスイッチ(コンテキストスイッチ)のオーバーヘッドが増えるだけになりそうなのでやめました。 --それにOSECPUの命令では、演算命令や比較命令で定数を指定することができません。「1を足す」とか「0と比較する」みたいなことができず、他のレジスタに事前に定数を代入しておいて、そのレジスタとの比較にしなければいけないのです。こんな仕様なのでレジスタは多そうに見えて実はそんなに多くないかもしれません。 --どうしてそんな命令の仕様なのかと言えば、それはJITコンパイラを単純化するためです。 -(1-2) どうしてレジスタマシンを採用したのですか?JIT前提のバイトコードって、スタックマシンが多いと思うんですが。 --うーん、まあ、作者の趣味・・・かなあ。もしあなたがスタックマシンを好きなのでしたら、それでOSECPUみたいなOSを構成してみたら面白いかもしれないですね! -(1-3) どうしてポインタに対してはこんなに厳しいチェックがあるのに、整数値については無頓着なの?0x7fffffffに1を足したら負の数になってしまうけど、これは明らかにおかしいよね? --確かに明らかにおかしいです。しかし整数演算までチェックを厳しくするとさすがに速度が落ちてきそうで心配です。それに計算の結果おかしな値になっていたとしても、それは計算をさかのぼることで原因を突き止められる場合が多いです。しかし一方、ポインタがおかしくなった場合は悲惨です。オブジェクトがあらぬ値で上書きされて、もう何が何だかわかりません。ということで、ポインタのチェックは省略しません。 --整数値については、想定している上限と下限だけをチェックすればいいかというとそうではない場合もあります。5の倍数しかありえないとか、1桁かもしくは5桁の数字になることが期待されているとか、その変域もかなり変則的です。そうであれば、自動のチェックはあまり役に立たないかもしれないので、CPUとしてはチェック機構を持ちません。しかしプログラマはそれらのルールをちゃんと反映してチェックしてください。そしてチェックコードを適切なアサートレベルのブロックに入れておいてください。これで翻訳時にどこまで反映させるかを選択することができます。 -(1-4) Pxxっていうレジスタは何?ポインタレジスタ??実際の値を参照したり表示したりできないって本当? --はい、ポインタレジスタです。何か値が入っていることは間違いないのですが、そして限定的に値を比較することもできるにはできるのですが、それ以外のことができません。「結局アドレスはいくつなのか?・・・分かりません」「定数を入れたいんだけど?・・・入れられません」でもポインタレジスタ同士の代入はできるので、値を伝えていくことはできます。またポインタ型のメモリに格納することもできます。でもそのメモリ内容はポインタ型以外にはキャストできないので、やはり具体的にどんな値が入っているのかを知る方法はありません。 --そもそもポインタレジスタもポインタ型のメモリも、何ビットであるのか明らかにされていません。結局何ビットでもいいのです。どうせ直接値を参照することがないので。たぶん将来的に何ビットにするかは前後していくと思います。 --ちなみにポインタレジスタという名前にもかかわらず、ポインタ以外の使い道もあるレジスタです。ファイルハンドルみたいに、他の値と間違えたら困るけど、その値そのものを見たり加工されたくない場合に、このPxxを使うことができます。その場合、ハンドルなのでメモリアクセスには全く使えません。 -''(2) アクセス制限関係'' -(2-1) OSECPUのアプリって、システムからメモリがもらえないって聞いたんですが本当ですか!?信じられません! --APIで、メモリくださーいって言うことはできません。こう考えてください。あなたは今からお使いに行きます。その時にお金を渡されます。だからその範囲で買ってきてください。十分に買えるはずです。無制限に使えるクレジットカードは渡しません。これがOSECPUのリソース管理の考え方です。 --アプリは起動時に引数でリソースを受け取ります。足りなくなっても誰も助けてくれません。また、自分の子分(ライブラリ)を使う場合には、あなたが持っているリソースを切り分けて渡します。子分だってリソースがなければ生きていけませんからね。 --現在の、好きなだけmallocできてしまうプログラミングスタイルは、明らかにクレジットカードを渡す方法です。メモリを食いつぶそうという悪意あるプログラムがいたらどうなりますか?みんな巻き込まれてしまいますよね?信用できない相手にクレジットカードを渡しますか?OSECPUは下請けの外部プログラムを基本的に信用しないのです。リソースは先払いで渡しますから、その範囲内でやってください。1000円で1500円の物を買ってこいとか、そんなことを言っているわけじゃないです。問題なくできるはずです。自分で自分のメモリの管理ができないような人は、OSECPUでは生きていけません。 -(2-2) もらったメモリを超えて使うことはできないんですか? --できません。やろうとしたら強制停止させられます。だから続行できません。 -(2-3) 子分は私のメモリを自由にアクセスできてしまうのですか?OSはアクセス制限によってアプリから自己を守っているようですが、アプリはアクセス保護によってライブラリ関数のバグから自己を守ることはできないのでしょうか? --できます。任意のポインタにアクセス域を設定できます。ただし、これは自分が持っているアクセス域よりも広くすることはできません。同じか小さくすることしかできません。これにより、ライブラリのバグから自己を守れます。 -(2-4) OSは追加のメモリをくれないだけではなく、アプリに時間の制約があるって本当ですか? --正確には時間ではなく、実行可能な命令数です。だから無限ループになったり、もしくはあまりにものろのろとやっていると、何の悪事を試みていなくても、勝手に止められてしまいます。時間ではないのでマルチタスクになっても動作可能量に影響はありません。PCの性能差があっても影響をうけません。・・・これもメモリと同じように、起動時に与えられていますし、ライブラリを使うのならライブラリにも分けてあげなければいけません。 -(2-5) ディスクにも制約はありますか? --あります。ディスクというかファイルシステムですね。まずパスはルートから記述することができません。OSが渡したカレントディレクトリに対する相対パスだけです。しかも親をたどることができません。さらに容量制限もかかっています。ライブラリにパスを渡すことができますが、その場合はライブラリも同じ制約を受けます。つまり、アクセス域は下位に行くにつれてどんどん小さくなっていくのです。 -(2-6) ライブラリが上記のいずれかの制約を守れずに停止させられてしまったら、呼び出し元であるアプリも停止させられてしまうの? --何も設定してなければそうなってしまいますが、もし適切なハンドラを登録しておけば、子分が引き起こしたエラーでアプリが停止しないで済むようにできます。これはもともとはプラグインの暴走から本体アプリを守るためのものです。しかしこのハンドラは自分より下位のものにしか有効ではありません。自分自身のエラーをハンドルすることはできません。 -(2-7) OSは基本的にすべてのアクセス権を持っているわけですよね?じゃあAPIをうまく使ってだませばいいのかな? --OSはアプリよりは広いアクセス権を持っているかもしれませんが、すべてではないと思います。OS自身もそれを切り分けてアプリを呼び出しているわけです。それで、OSをだます作戦についてですが、OSECPUにはカーネルモードとかスーパーバイザーモードがあるわけではなく、つまりは常にアクセス制限を受けています。言い方を変えればアプリもOSと同じモードで動いています。・・・あなたはシステムコールに際して、不当に広域なポインタをパラメータに書かなければ、OSに悪事を代行させることができません。でも、そのような広域なポインタをどうやって作るのですか?というかそれができるのなら、わざわざOSを使わずとも目的は達せられるのではないですか? --モードがない(モードの切り替えがない)ということは、モードを切り替えるためのパスワードみたいなものも必要ないということです。rootパスワードとかそういうものはOSECPUとは無縁です。・・・OSは特権を有し、非常時にはアプリにもその特権を与えられるような仕組みしたUNIXだからこそ、典型的な攻撃が成立していたのです。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
テキスト整形のルールを表示する