page0060
の編集
http://osecpu.osask.jp/wiki/?page0060
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
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
* x86バイナリ → OSECPUバイトコード -(by [[K]], 2013.08.05) ** (0) はじめに -OSECPUはアプリがライブラリが十分にそろっているとは言えない状態です。それでみなさんいろいろな言語を開発してくれていて本当に助かります。また現状のASKAだけで頑張ってアプリを作ってくれている人にも感謝感激です。 -ところでOSECPUアプリを増やす手っ取り早い方法として、x86のコードをOSECPUバイトコードにしたらどうだろうという「安易な」アイデアがあります。そうすればアプリは一気に増やせるだろうと。確かにそうですね、うまくいけば。 -そしてこの手の開発をかなり得意としているのは実は[[K]]自身なので、今から適当に設計して、それで少々考察してみようと思います。 ** (1) メモリアクセス -まずx86では、ポインタレジスタと整数レジスタの区別はなく、すべて汎用レジスタとして扱われます。しかもメモリに型はありません。x86上の各言語は型をもっていますが、x86の機械語になった後では、その型を推測することは容易ではありません。さらにあるメモリに対して32ビットでアクセスしたり、はたまた同じところを8ビットでアクセスしたりすることが許されていて、そういうことをやってしまうコードもたくさん存在します。 -となれば、これらをすべて解消できる手法は以下の通りだと思います。 --(1) Win32やPOSIXではセグメンテーションを使ってないので、とりあえずセグメンテーションのことは気にしないことにする。ページングでエイリアスとかやっているかもしれないけど、それも真面目に考えると疲れるのでひとまず無視する。 --(2) EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDIの8レジスタはすべて整数レジスタとする。 --(3) メモリアクセスはすべて8ビットとして、32ビットアクセスがあった場合は4回のメモリアクセスに分解し、シフトしてORする。 ---もはやこれ以外にエンディアンの影響を受けない確実な方法がない。 ---メモリアクセスが4倍遅くなるけど、もうそれも気にしない。 ---この方法なら型が分からないという問題も起きない。 --(4) 全アドレス区間は P01 にすべて押し込む。で、EBXでのメモリリードアクセスがあれば、PALMEM0(?, T_UINT8, P01, EBX); みたいにして読み込む。ライトも同様。 ** (2) フラグ類 -キャリーフラグとかゼロフラグとかそういうのはどうするかというと、それぞれレジスタに割り振るのが簡単でいいと思う。これは遅そうだなあ。・・・まあでももう遅くなることは気にしないことにしよう。 ** (3) パーシャルレジスタ -たとえばALに代入すると、EAXやAXの下位ビットも変わらなければいけない。ええいめんどうだ、ALに関する演算があったら、EAXから8ビットを切り出して、それに対して演算したのち、EAXの下位8ビットに戻してやろう。 ** (4) 自己書き換え -自己書き換えをするようなコードは捨てる。これをまじめにやると、本当にしんどい。書き足されるだけならまだしも、上書きとかされるかもしれないから。 ** (5) ポインタによるジャンプ -定数ジャンプはいい。それは2パスにすれば何とかなる。しかし間接ジャンプはどうしよう。これはやばいぞ。うまい方法が思いつかない! -よし、間接ジャンプ命令を使っているところがあったら、give-upしてしまうことにしよう。つまり変換できない。・・・うわー、これは相当にコンバート可能なコードが減りそうだな・・・。 -関数呼び出しも、スタックいじってリターンアドレスを変更したらアウトだな・・・。 ** (6) ここまで書いて思ったこと -本当にOSECPUはよくできている。フラグ方式なんて、CPUが違ったらエミュレーションするのがこれほど大変だということだ。パーシャルレジスタもエミュレーションがすごく手間。メモリアクセスもunion的なアクセスを許してしまうからこんな面倒なことになる。 -それらが一切ないOSECPUは本当にさまざまなCPUにすんなりと適合できる。 -jitcのAPIも本当によくできている。いつどこを書き換えられるかわからない「自己書き換え」とはえらい違いだ。 -OSECPUはポインタレジスタの分離とラベル命令のおかげで、間接ジャンプの問題が起きない! ** (7) セキュリティはどうなったか -まずメモリアクセスに関するセキュリティは、NULLくらいなら検出できる。他のものについては内部のバグは見つけられない。 --P01をmallocしたときにP01--;を実行すればいい。そうすれば、P01[0]はアクセス可能域ではないので、エラーになる。マイナス1じゃなくて256とか4096とかでもいい。 --x86のアプリは結局みんなP01を使ってメモリアクセスをするので、中でポインタアクセスでへまをやっても気づけない。しかしそれでも他のOSECPUバイトコードが、x86由来のバイトコードのバグによって、やられてしまうことはない。 -間接ジャンプはないので、結果的に危険な分岐はなくなったかもしれない。 -無限ループ問題はOSECPU化によって自動で守られる。 -double-freeとかuse-after-freeなどの問題は、基本的にP01の中を自前の簡易mallocで切り分けているだけなので、検出できない。 * こめんと欄 #comment
タイムスタンプを変更しない
* x86バイナリ → OSECPUバイトコード -(by [[K]], 2013.08.05) ** (0) はじめに -OSECPUはアプリがライブラリが十分にそろっているとは言えない状態です。それでみなさんいろいろな言語を開発してくれていて本当に助かります。また現状のASKAだけで頑張ってアプリを作ってくれている人にも感謝感激です。 -ところでOSECPUアプリを増やす手っ取り早い方法として、x86のコードをOSECPUバイトコードにしたらどうだろうという「安易な」アイデアがあります。そうすればアプリは一気に増やせるだろうと。確かにそうですね、うまくいけば。 -そしてこの手の開発をかなり得意としているのは実は[[K]]自身なので、今から適当に設計して、それで少々考察してみようと思います。 ** (1) メモリアクセス -まずx86では、ポインタレジスタと整数レジスタの区別はなく、すべて汎用レジスタとして扱われます。しかもメモリに型はありません。x86上の各言語は型をもっていますが、x86の機械語になった後では、その型を推測することは容易ではありません。さらにあるメモリに対して32ビットでアクセスしたり、はたまた同じところを8ビットでアクセスしたりすることが許されていて、そういうことをやってしまうコードもたくさん存在します。 -となれば、これらをすべて解消できる手法は以下の通りだと思います。 --(1) Win32やPOSIXではセグメンテーションを使ってないので、とりあえずセグメンテーションのことは気にしないことにする。ページングでエイリアスとかやっているかもしれないけど、それも真面目に考えると疲れるのでひとまず無視する。 --(2) EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDIの8レジスタはすべて整数レジスタとする。 --(3) メモリアクセスはすべて8ビットとして、32ビットアクセスがあった場合は4回のメモリアクセスに分解し、シフトしてORする。 ---もはやこれ以外にエンディアンの影響を受けない確実な方法がない。 ---メモリアクセスが4倍遅くなるけど、もうそれも気にしない。 ---この方法なら型が分からないという問題も起きない。 --(4) 全アドレス区間は P01 にすべて押し込む。で、EBXでのメモリリードアクセスがあれば、PALMEM0(?, T_UINT8, P01, EBX); みたいにして読み込む。ライトも同様。 ** (2) フラグ類 -キャリーフラグとかゼロフラグとかそういうのはどうするかというと、それぞれレジスタに割り振るのが簡単でいいと思う。これは遅そうだなあ。・・・まあでももう遅くなることは気にしないことにしよう。 ** (3) パーシャルレジスタ -たとえばALに代入すると、EAXやAXの下位ビットも変わらなければいけない。ええいめんどうだ、ALに関する演算があったら、EAXから8ビットを切り出して、それに対して演算したのち、EAXの下位8ビットに戻してやろう。 ** (4) 自己書き換え -自己書き換えをするようなコードは捨てる。これをまじめにやると、本当にしんどい。書き足されるだけならまだしも、上書きとかされるかもしれないから。 ** (5) ポインタによるジャンプ -定数ジャンプはいい。それは2パスにすれば何とかなる。しかし間接ジャンプはどうしよう。これはやばいぞ。うまい方法が思いつかない! -よし、間接ジャンプ命令を使っているところがあったら、give-upしてしまうことにしよう。つまり変換できない。・・・うわー、これは相当にコンバート可能なコードが減りそうだな・・・。 -関数呼び出しも、スタックいじってリターンアドレスを変更したらアウトだな・・・。 ** (6) ここまで書いて思ったこと -本当にOSECPUはよくできている。フラグ方式なんて、CPUが違ったらエミュレーションするのがこれほど大変だということだ。パーシャルレジスタもエミュレーションがすごく手間。メモリアクセスもunion的なアクセスを許してしまうからこんな面倒なことになる。 -それらが一切ないOSECPUは本当にさまざまなCPUにすんなりと適合できる。 -jitcのAPIも本当によくできている。いつどこを書き換えられるかわからない「自己書き換え」とはえらい違いだ。 -OSECPUはポインタレジスタの分離とラベル命令のおかげで、間接ジャンプの問題が起きない! ** (7) セキュリティはどうなったか -まずメモリアクセスに関するセキュリティは、NULLくらいなら検出できる。他のものについては内部のバグは見つけられない。 --P01をmallocしたときにP01--;を実行すればいい。そうすれば、P01[0]はアクセス可能域ではないので、エラーになる。マイナス1じゃなくて256とか4096とかでもいい。 --x86のアプリは結局みんなP01を使ってメモリアクセスをするので、中でポインタアクセスでへまをやっても気づけない。しかしそれでも他のOSECPUバイトコードが、x86由来のバイトコードのバグによって、やられてしまうことはない。 -間接ジャンプはないので、結果的に危険な分岐はなくなったかもしれない。 -無限ループ問題はOSECPU化によって自動で守られる。 -double-freeとかuse-after-freeなどの問題は、基本的にP01の中を自前の簡易mallocで切り分けているだけなので、検出できない。 * こめんと欄 #comment
テキスト整形のルールを表示する