タグ

x86に関するkazuhookuのブックマーク (13)

  • Native Clientの仕組みはどうなっているのか? - やねうらお−よっちゃんイカはしばらく買わずにiPhoneだけに注力する男

    Googleが、Webブラウザ上でネイティブバイナリコードを実行する「Native Client」を公開した。 Native Client http://code.google.com/p/nativeclient/ Google Earth,Quakeなどがすでに動いているようだ。 これはすごい!ブラウザ上でX86バイナリを動かす「Native Client」 http://www.moongift.jp/2008/12/native_client/ サンドボックスで安全性確保、オーバーヘッド5% ブラウザでx86バイナリ実行、グーグルが新技術 http://www.atmarkit.co.jp/news/200812/09/nacl.html あと、サンプルのlife.ccにSDL_surfaceと書いてあるのでSDLの描画まわりが既に動いているのだろうから、今後、たくさんのアプリがN

    Native Clientの仕組みはどうなっているのか? - やねうらお−よっちゃんイカはしばらく買わずにiPhoneだけに注力する男
    kazuhooku
    kazuhooku 2008/12/11
    よくまとまってる。でも、これは静的検証と動的エラーを混同してるんじゃないかなぁ>「プログラムにこういう制約を与えて、あらゆるプログラムをRing0で動かせばRingを切り替えるオーバーヘッドが無くなる」
  • 革命の日々! [kernel watch没ネタ集] long nop バトル

    x86には様々なNOPがあり、Intel® 64 and IA-32 Architectures Software Developer’s Manual に記載のあるものだけでも1byte長から9byte長までの種類がある。 これにprefix等の選択肢を考えると、まさに無限に広がる大宇宙。といった感じの可能性の広さである。 で、LKML内ではNOPの種類によって速度が変わることが広く知られていて、時折どのNOPを使うのがよいかが熱い議論になる。 特に近年は自己書き換えコードの都合で最速5byte NOP議論が熱い(long jumpが5byteだからね)。 まあ、5byte NOPと3byte NOP + 2byte NOP(とprefix NOP)のどれが速いか、なんて議論は、自転車置き場理論によって無駄にスレッドがのびていくので見ていて楽しい(ほんとか?) で、最近話題になったのはl

  • hotpatch - firewood's diary

    NyaRuRuさんのところを読んでいたら、2003server/Vistaではhotpatchが可能とのこと。(話題が二年遅れ) 要するに DLL のエクスポート関数の先頭を jmp 命令で書き換えてしまうという,古典的な方法の模様. (snipped) これを実現するには DLL のエクスポート関数の先頭が 2 byte 命令でないと厄介なため,コンパイラレベルで考慮してあげる必要があって,実際最近の Visual C++ にはこんなオプションが追加されています. Hot-patching - NyaRuRuの日記 Microsoftが提供するhotfixが再起動不要になるというだけで、ユーザーが作成するDLLにも対応しているわけではないようだが、コンパイルオプション自体はVC2005からあるみたい。 /hotpatchを試してみたところ、アセンブリソースレベルでは関数の先頭に「npad

    hotpatch - firewood's diary
  • VX32 Virtual Extension Environment

    Vx32: portable, efficient, safe execution of untrusted x86 code Bryan Ford Russ Cox Computer Science and Artificial Intelligence Laboratory Massachusetts Institute of Technology About Vx32 is a user-mode library that can be linked into arbitrary applications that wish to create secure, isolated execution environments in which to run untrusted extensions or plug-ins implemented as native x86 code.

  • const char* const p = "ABC"; と const char q[] = "ABC"; はどちらがよいか、みたいな与太 - memologue

    諸事情あって、ふと前に読んだドキュメントに書いてあった細かいことが気になった。いやいつも細かいけど。 const char* const p = "ABC";より const char q[] = "ABC";のほうがいいのか?的な話。後者の方が良いらしいので、確認するととともに、すぐになんでも書くのはどうなんだと思いつつも無駄に細かく解説。いろいろ間違ってたらゴメンナサイ。C言語入門? 先に結論 共有ライブラリやPIEな実行ファイルを作る場合は、後者の書き方(const char q[] = "xxx")のほうが良さそうですね。PIEじゃない単なる実行ファイルを作るときは、最適化かけるならあんまりかわらないかも。 比較1) コンパイル時の最適化の効きやすさ 最適化といってもいろいろありますが、↓に限って言えば、const char q[] のほうが効きやすいようですね。 gcc vers

    const char* const p = "ABC"; と const char q[] = "ABC"; はどちらがよいか、みたいな与太 - memologue
    kazuhooku
    kazuhooku 2008/07/08
    不便ですなぁ>「mov 0xほげ(%eip) ふが; とか出来れば一番いいんですが(x86_64はできる)、x86はそういうPC相対のアドレス指定はできません。というか、eipを直接的に得ることすら出来ません」
  • memcpy performance - Intel® Software Network

    memcpy performance abstract Normal usage of memcpy() with gcc presents serious performance issues.  Implications and some possible avoidance measures are discussed for both 32- and 64-bit builds background linux gcc carries on the Unix tradition from the early days of C, when the run-time libraries weren't considered as part of the compiler.  Thus, there is little coordination between compiler and

    kazuhooku
    kazuhooku 2008/06/16
    autovectorization を使うよう memcpy を C で独自定義
  • x86カルトクイズ(解答編) (mitsunari@cybozu labs)

    問題編はこちらのx86カルトクイズです. Q1 [乗算の削減] lea eax, [eax + eax*8] lea eax, [eax + eax*4] 45 = 9 * 5 = (8 + 1) * (4 + 1)を利用する.乗算命令が速くなったとはいえ,まだadd/sub/shift/leaの組み合わせを使った方が速いことが多い. Q2 [条件分岐の削減] cdq xor eax, edx sub eax, edx 条件分岐は可能な限り使わない.次の二つの恒等式 -x = x ^ (-1) - (-1) x = x ^ 0 - 0 と unsigned int m = (x < 0) ? -1 : 0 を組み合わせることで絶対値を unsigned int m = x >> 31; return x ^ m - m; と実現する.ここでmを取得する部分は mov edx, eax sa

    kazuhooku
    kazuhooku 2007/10/09
    「瑣末な知識を覚えるよりも,常に代替ロジックが無いかを考える方がよりよいコードに繋がる」
  • x86カルトクイズ (mitsunari@cybozu labs)

    x86の解説をいざ始めてみると,どうもblogという媒体はやりにくいので別ページで進めることにしました.すいません.まとめ直すまでしばらくお待ちください.あと基的なことばかり続いたので,ちょっとマニアックネタに走ってみます. というわけで突然ですがクイズです.そこそこ高い難易度に設定したつもりですが,いかがでしょう.初心者の方は全然分からなくても大丈夫です.あえて曖昧な記述をしている部分もあります.後半の答えは凄いものがあるといいなあ.あと,難問奇問募集中. 以下は断りがない限り, 環境は32bit OS上のPentium4以降のx86 CPU 関数の呼び出し規約は__cdecl 配列は16byte alignmentされていて複数の配列はオーバーラップしていない ループは4の倍数と仮定してよい ものとします.CPUに依存する場合は明記してください. Q1(5点) 符号なしeaxの値を4

    kazuhooku
    kazuhooku 2007/10/05
    答えが降ってくることを期待age
  • Xbyakで始めるx86(IA-32)入門(2-1) (mitsunari@cybozu labs)

    前回言い忘れましたが,このシリーズの目標はLL魂2007デモコードのchaos.cpp程度のものを読めて理解できることを考えています. 具体的には レジスタやスタックを理解する 関数を作れる SIMD命令の基礎を知る JITのメリットを理解する あたりを目指します.なお,JITアセンブラは通常のアセンブラに比べてワンクッション概念が必要になります.もしかしたらアセンブリ言語の当の入門としては不適切かもしれませんが,まあご了承ください. それでは,最初に他の言語と同様,"Hello Xbyak!"を表示してみましょう. #include "xbyak/xbyak.h" #include <stdio.h> struct HelloGenerator : public Xbyak::CodeGenerator { // (A) HelloGenerator() // (B) { push((

  • Xbyakで始めるx86(IA-32)入門 (mitsunari@cybozu labs)

    ここでは何回かに分けてx86(IA-32),いわゆる普通のPentiumパソコンで使われている機械語の説明をする予定です. アセンブラ,アセンブリ言語としては拙作のXbyakを使うことにしました. 理由は, 普通のgasやNASMによる解説はありふれていること WindowsLinux,Intel Macで同じソースが使え,C++だけで閉じているためアセンブラの設定に悩まなくてすむこと JITなどの特殊な最適化ができること などがあります(半分は自己満足ですね). 内容は基的なところから始めますが,場合によってはマニアックネタに走るかもしれません.最初のうちはx86アセンブリ言語入門と重複することも多いと思います. 以下は単なる私の価値観ですが,機械語を絶対に知っておくべきものであるとは思いません.けれども何事もかじってみるのは悪くないと思います. 必要だから勉強する,不要だから勉強し

    kazuhooku
    kazuhooku 2007/09/26
    キター
  • x86 calling conventions - Wikipedia

    This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (February 2008) (Learn how and when to remove this template mes

  • Frank's Technotes: 64-bit atomic operations.

    kazuhooku
    kazuhooku 2007/09/14
    バウンダリ揃えればmovqで64bit atomic accessが可能
  • 並列プログラミング(その2) : DSAS開発者の部屋

    3.Memory Ordering シングルプロセッサのマルチスレッドでは、volatile変数をフラグにして簡単な同期を書くことができました。 例えば、次のような感じです。(コンパイラはvolatile変数へのアクセスの順序を入れ替えないものとします) volatile int done = 0; volatile struct { int foo; int bar; } foobar; void writer(void) { foobar.foo = fizz(); foobar.bar = bazz(); done = 1; } void reader(void) { int foo, bar; while (!done) sleep(1); foo = foobar.foo; bar = foobar.bar; } これは、マルチプロセッサ環境では上手くいかないことがあります。今時

    並列プログラミング(その2) : DSAS開発者の部屋
    kazuhooku
    kazuhooku 2007/09/14
    :::memory をつけないとgccがリオーダリングするとかしないとか
  • 1