問題タブ [sysenter]
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.
objective-c - CPUはattributesOfItemAtPath:errorで発生します:
[NSFileManager attributesOfItemAtPath:error:]
ファイルの属性を取得する関数を使用しています。しかし、時々私のアプリケーションのCPUは100%になります。この関数を100k(約)のファイルに使用しています。
私のアプリケーションのサンプル:
誰か助けてくれませんか?
linux - Linux で SYSENTER Syscall サポートを無効にして int $0x80 のみを使用する方法
SYSENTER
syscall サポートを無効にしint $0x80
て、ptrace を使用せずにすべてのシステム コールを Linux の割り込みでフォールバックさせようとしています。
2 つの方法を見つけました:</p>
/proc/sys/vm/vdso_enabled
ファイルを 0に変更して VDSO を完全に無効にする- 変更
/usr/src/linux/arch/x86/vdso/vdso32-setup.c
VDSO(仮想動的共有オブジェクト)を変更することが私のアプローチの方法ですが、どの行を変更すればよいかわかりません。誰かが私に何か提案をしてもらえますか?
ありがとうございました。
linux - 32ビットLinuxのSyscallまたはsysenter?
MS-DOS以来、割り込みを使用したシステム呼び出しを知っています。古い論文では、int 80h
Linuxでシステム関数を呼び出すための参照を見ました。かなり長い間、私は命令int 80h
を支持して非推奨になっていることを知っています。syscall
しかし、32ビットマシンでは動作しません。
質問
命令はsyscall
64ビットプラットフォームでのみ使用されますか?32ビットLinuxは利用しませんsyscall
か?
サンプルテスト
私の32ビットLinux(Ubuntu Precise)では、このプログラムはコアダンプで終了します。
sysenter
の代わりに試してみましsyscall
たが、同じようにクラッシュします。
windows - Windows 7 x86 は、sysenter を使用して直接システム コールを実行します。
ntdll.dll を介さずにシステム コールを直接呼び出すプログラムを作成しようとしています。
私のコード(Visual Studio構文...):
プログラムが sysenter 命令を実行しようとすると、次のアクセス違反でプログラムがクラッシュします。
カーネル デバッガーを使用して目的のシステム コールに hw ブレークポイントを設定しようとしましたが、実行フローがそこに到達しません...
問題はスタックの順序/深さに関係していると思います。
どうもありがとう!
解決済み:
問題は、user32 および gdi32 dll をロードせずに win32k システム コールを実行しようとしたことだと思います。
追加したばかりです:
そして問題解決..
これらのdllをロードせずになぜこれが起こるのか、誰かがより良い考えを持っているなら、私は喜んで知っています:)
linux - Linux システムコールレジスタ退避
32 ビット Linux システム コールに関して 2 つの簡単な質問があります。
x86 Linux では、システム コールを呼び出す方法が 2 つあります。
1 つは int 0x80 を使用しており、もう 1 つは sysenter を使用しています。
これら2つの基本的な概念の違いを知っています(sysenterはSYSENTER_MSR_EIP、SYSENTER_MSR_ESPレジスタを使用し、int 0x80は割り込みテーブルを使用し、sysenterはより優れたパフォーマンスを提供します...)
私の質問は...
プログラマーの観点から、int 0x80 と sysenter の間に機能上の違いはありますか? (つまり、呼び出し規約、メモリ レイアウトへの副作用、または何でも...)
システムコールから復帰後、EAXレジスタ以外に変化するシステムコールはありますか?
前もって感謝します。
linux - sysenter/sysexit の使用時に Linux カーネルがすべてのレジスタを復元しないのはなぜですか?
Linux カーネル 2.6.11 では、sysenter を使用してシステム コールを実行する場合、init 0x80 とほぼ同じで、save_all を使用してすべてのレジスタをカーネル スタックにプッシュしますが、コールが終了した後、関連するフラグが設定されていない場合、 sysexit を使用して戻りますが、スタックに保存されたすべてのレジスタを復元するわけではありません。
一部のシステム コールはレジスタ値を変更する可能性があります。すべてのレジスタを再設定する必要がないのはなぜですか
対応する i386 doc を読みました。
「Intel386 のすべてのレジスタはグローバルであるため、呼び出し関数と呼び出された関数の両方に表示されます。レジスタ %ebp、%ebx、%edi、%esi、および %esp は、呼び出し関数に「属します」。つまり、呼び出された関数呼び出し元のためにこれらのレジスタの値を保存する必要があります. 残りのレジスタは呼び出された関数に「属します」. 呼び出し元の関数がそのようなレジスタ値を関数呼び出し全体で保持したい場合は、ローカルスタックフレームに値を保存する必要があります.
したがって、保存作業を行うのは glibc ラッパー関数の責任であり、それを確認するためにいくつかの glibc コードを読みました。したがって、sysenter/sysexit を使用してシステム コールを実行する場合、最初に %ebp、%edx、%ecx をユーザー スタックにプッシュするのは理にかなっています。これは、%edx と %ecx が保存レジスタにないためです。完了後に後で復元する必要があります。また、%ebp を使用して、システム サービス ルーチンを呼び出す前にユーザー スタック ポインターを保存するため、パラメーターを渡すために復元する必要があります。
system-calls - Sysenter は SIGILL シグナルになります。x86_64 で Int0x80 / Sycall / Sysenter をテストするには?
.
x86_64 OpenSUSE で strace のようなコマンドを再コーディングする学校のプロジェクトがあります。(インテルi7)
もちろん、この目的のために ptrace システム コールを使用していますが、PTRACE_SYSCALL を使用することは禁止されています。PTRACE_SINGLESTEP を使用し、PTRACE_PEEKTEXT とシステム コール命令に対応するオペコード (int0x80 の場合は 0x80CD、syscall の場合は 0x050F、sysenter の場合は 0x340F) のおかげでシステム コールを検出する必要があります。
そこまでは元気です。しかし、システムコールのパラメータを取得する必要があります。syscall と intx80 の場合は簡単です。rax を調べて、それがどのシステム コールかを調べてから、rdi、rsi、rdx などを調べます。
しかし、sysenter の場合、実際にどのように機能するのかわかりません。そこで、これら 3 つの命令をテストするために、小さなアセンブリ プログラムをコーディングしてみました。
これは完全に正常に機能します!
int 0x80 バージョンでは、rax のシステム コールの番号を 1 から 4 に変更しただけです (32 では、理由はわかりませんが、システム コールの番号は同じではありません)。
これは 50% で動作します。文字列が表示されますがゴミです。
ここで、sysenter を配置すると、SIGILL シグナルを受け取ります。rax で 1 と 4 を試しました。
私のプロジェクトは自分のコンピューターで実行する必要がありますが、sysenter を使用しているバイナリを検出して分析できる必要があります
誰かがそれらのことについて少し説明できますか?
ありがとうございました !
Ps : 下手な英語でごめんなさい