問題タブ [rdtsc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - LinuxでRDTSCを偽造する方法
私は現在、crackmeに取り組んでいます。RDTSC
x86 アセンブリで、デバッガーなどによって速度が低下した場合にタイム スタンプを取得するために使用されます。
現在、Macos + VirtualBox Debian32 に取り組んでいます。
私の戦略は、最初のRDTSC
呼び出しを保持し、それを保存することeax
でしedx
た。rdtsc
他の呼び出しのためにどこかに保管してください。以前の値eax
とedx
値を現在のものに設定します。私はこの戦略では運がありません。Crackme はまだ私を知っています。
rdtsc
Google で検索したところ、偽の通話を可能にする別の Windows プログラムである IDAstealth が見つかりました。
Linuxでこれに相当するものを探しています。rdtsc
Linuxで値を設定する方法はありますか?
gcc - ASM クロバー ヘルプ。rdtsc で ax、dx、またはメモリを上書きする必要がありますか?
私は多くの ASM を理解していません。最近、次のようなインライン gcc asm に出くわしました。
x
カウンターの下位 32 ビットを 32ビットの符号なし整数に入れるように見えます。私が理解できないのは、なぜ clobberax
とdx
. それは同期のためですか、それとも他の理由ですか? 私は多くのrdtsc
例を見てきましたが、そのクロバーax
とdx
.
また、については、ここrdtsc
を読んだ場合、gccは命令を並べ替えません。それは良いアドバイスであり、命令の並べ替えを防ぐための提案はありますか?memory
rdtsc
ありがとう
c - バックツーバックの rdtsc を使用した負のクロック サイクル測定?
セマフォの取得に必要なクロック サイクル数を測定するための C コードを作成しています。私は rdtsc を使用しています。セマフォで測定を行う前に、rdtsc を 2 回連続して呼び出してオーバーヘッドを測定しています。これを for ループで何度も繰り返し、平均値を rdtsc オーバーヘッドとして使用します。
まず平均値を使うということでよろしいでしょうか?
それにもかかわらず、ここでの大きな問題は、オーバーヘッドの負の値が得られることがあることです (必ずしも平均化されたものではなく、少なくとも for ループ内の部分的なもの)。
これは、操作に必要な CPU サイクル数の連続計算にも影響し、sem_wait()
負になることもあります。私が書いたことが明確でない場合は、ここに私が取り組んでいるコードの一部があります。
なぜ私はそのような負の値を得ているのですか?
(編集者注:完全な 64 ビット タイムスタンプを取得するための正確で移植可能な方法については、CPU サイクル カウントを取得しますか?"=A"
を参照してください。asm 制約は、x86-64 用にコンパイルされた場合、レジスタ割り当てが発生するかどうかに応じて、下位または上位 32 ビットのみを取得します。出力に RAX または RDX を選択しuint64_t
ます。選択しませんedx:eax
。)
(編集者の 2 番目のメモ: おっと、それがなぜ否定的な結果が得られたのかについての答えです。このrdtsc
実装をコピーしないようにという警告として、ここにメモを残しておく価値があります。)
assembly - アセンブリ ファイルで使用する場合の rdtsc のリセット方法。クロック サイクルの前後のデータを読み込む必要があります
rdtsc をアセンブリ ファイルで使用すると停止しますか? 提起されたフラグはありますか?どうすればリセットできますか?最初のクロック スタンプを rdx レジスタに読み込みました。しかし、数秒待ってからクロックサイクルを再度印刷しようとすると、同じ数値のままです。
c# - C#でrdtscを使用するには?
私はパフォーマンス カウンターに取り組んでいます。これは常にアプリ内で実行され、リリース バージョンは常に実行されます。したがって、可能な限り高速である必要があります。
私は c#StopWatch
と c++ を比較rdtsc()
しましたが、100 000 000 サイクルで 3 秒かかるrdtsc()
のは、必要な 23 秒に対して明確な勝者StopWatch
です。
私の問題は、rdtsc()
C ++から呼び出す方法しか知らないことです。
それを行うための標準的な方法があるかどうか、または管理されたc ++ dllを作成する必要があるかどうか、誰かが提案できますか?
intel - cpuid より安価なシリアル化命令はありますか?
hereおよびhereを含む関連する質問を見てきましたが、シリアル化についてこれまでに言及された唯一の命令rdtsc
はcpuid
.
残念ながら、cpuid
私のシステムでは約1000サイクルかかるので、より安価な(サイクルが少なく、メモリへの読み取りまたは書き込みがない)シリアル化命令を誰かが知っているかどうか疑問に思っていますか?
を見ましたiret
が、それは制御フローを変更するようで、これも望ましくありません。
についてのアレックスの回答にリンクされているホワイトペーパーを実際に見ましたが、次のrstscp
ように書かれています。
RDTSCP 命令は、カウンターを読み取る前に、前のすべての命令が実行されるまで待機します。ただし、後続の命令は、読み取り操作が実行される前に実行を開始する場合があります。
その2番目のポイントは、理想的ではないことです。