9

MS-DOS以来、割り込みを使用したシステム呼び出しを知っています。古い論文では、int 80hLinuxでシステム関数を呼び出すための参照を見ました。かなり長い間、私は命令int 80hを支持して非推奨になっていることを知っています。syscallしかし、32ビットマシンでは動作しません。

質問

命令はsyscall64ビットプラットフォームでのみ使用されますか?32ビットLinuxは利用しませんsyscallか?

サンプルテスト

私の32ビットLinux(Ubuntu Precise)では、このプログラムはコアダンプで終了します。

global _start

_start:
        mov     eax, 4                ; 4 is write
        mov     ebx, 1                ; 1 is stdout
        mov     ecx, message          ; address of string
        mov     edx, length           ; number of bytes
        syscall

        mov     eax, 1                ; 1 is exit
        xor     ebx, ebx              ; return code 0
        syscall

message:
        db  10,"Hello, World",10,10
length  equ $ - message

sysenterの代わりに試してみましsyscallたが、同じようにクラッシュします。

4

2 に答える 2

6

いくつかのWeb検索の後、StackOverflowに関するこの別のトピックにたどり着きました。Linuxはsysenterチュートリアルを介してシステムコールを呼び出します。システムを呼び出すための推奨される方法は、を使用することでも、を使用するint 80hことでもsyscallないことを示していますsysenterが、linux-gate.so

クラッシュとコアダンプについてはまだ疑問が残ります。私の推測では、syscallまたはsysenter命令はCPU命令として使用できますが、Linuxカーネルは、特定のハードウェアプラットフォームで実際には役に立たないと判断した場合、この「エントリポイント」を適切に設定しない可能性があります。

32ビットプラットフォームであるように見えます。sysenterまたは、64ビットプラットフォームでのみ利用可能ですが、常に利用可能である可能syscall 性があります。

私はこれが私の質問に答えると感じていますが、上記の推測の信頼できる参考資料のように、さらに多くの資料を歓迎します。

- アップデート -

少なくとも、私は上記を確認するこれを見つけることができました。それはまだ信頼できる参考資料ではありませんが、私が信じるほど十分に信頼できるようです。

linux-gate.so.1とは何ですか?、言う:

システムコールを呼び出すための好ましい方法は 、起動時にカーネルによって決定され、明らかにこのボックスはsysenterを使用します。

また、別のソースから、サンプルのFASMアセンブリソース(NASMを使用する場合はいくつかの変換が必要)を使用して、次の方法でシステム関数を呼び出しますlinux-gate.soアセンブリでlinux-gate.so.1を検索します。

于 2013-03-24T15:44:02.360 に答える
6

Intelのマニュアルにはsyscall、互換性(32ビット)モードでは無効であると記載されているため、カーネルで使用しないでください。

これはIntelのみの制限のようです:https ://stackoverflow.com/a/29784932/895245 AMDにはありませんが、確かにLinuxはIntelをサポートする必要があります:-)

sysenterより高速であるため、今日それを行うための最良の方法のようですが、インラインアセンブリ(x86 / amd64 linux)でsysenterを介してシステムコールを呼び出す方法int 0x80で説明されているように、VDSOを介して間接的に使用する必要がありますか?

于 2015-04-21T22:42:58.540 に答える