1

システム コールの作成に使用される Linux カーネル内の __kernel_vsyscall メソッドを探しています。コードを観察して詳細を確認したいのですが、grep検索ではそれを見つけることができず、インターネット上でその場所を見つけることができません。誰かが私にそれがどこにあるかを正確に指摘できますか? そして、それは操作できますか?

助けてくれてありがとう!

4

2 に答える 2

3

現在のディレクトリが Linux カーネル ソースの先頭にあると仮定すると、__kernel_vsyscall シンボルを定義するファイルの場所は次のとおりです。(以下に示すのはすべて x86 のみです。他の多くのハードウェア アーキテクチャにはまだ存在しません)。

./arch/x86/vdso/vdso32/syscall.S:
__kernel_vsyscall:

./arch/x86/vdso/vdso32/sysenter.S:
__kernel_vsyscall:

./arch/x86/vdso/vdso32/int80.S:
__kernel_vsyscall:

ご覧のとおり、基本的には、int80.S、sysenter.S、および syscall.S の 3 つのファイル内で宣言および実装されています。

syscall.S を取る:

__kernel_vsyscall:
.LSTART_vsyscall:
        push    %ebp
.Lpush_ebp:
        movl    %ecx, %ebp
        syscall
        movl    $__USER32_DS, %ecx
        movl    %ecx, %ss
        movl    %ebp, %ecx
        popl    %ebp

そして、上記の「syscall」は、上記のファイルと「arch/x86/vdso/vdso32/sigreturn.S」を組み合わせて読み込むと、実際には「int 0x80」に解決されます。

また、sysenter.S については、Intel アセンブリ命令「sysenter」を使用してシステム コール遷移を実装しています。

また、int80.S では、システムコール遷移に「int 0x80」を使用しています。

また、syscall の実装に使用する方法を尋ねた場合は、arch/x86/vdso/vdso32-setup.c を調べてください。

int __init sysenter_setup(void)
{
        void *syscall_page = (void *)get_zeroed_page(GFP_ATOMIC);
        const void *vsyscall;
        size_t vsyscall_len;

        vdso32_pages[0] = virt_to_page(syscall_page);

#ifdef CONFIG_X86_32
        gate_vma_init();
#endif

        if (vdso32_syscall()) {
                vsyscall = &vdso32_syscall_start;
                vsyscall_len = &vdso32_syscall_end - &vdso32_syscall_start;
        } else if (vdso32_sysenter()){
                vsyscall = &vdso32_sysenter_start;
                vsyscall_len = &vdso32_sysenter_end - &vdso32_sysenter_start;
        } else {
                vsyscall = &vdso32_int80_start;
                vsyscall_len = &vdso32_int80_end - &vdso32_int80_start;
        }

        memcpy(syscall_page, vsyscall, vsyscall_len);
        relocate_vdso(syscall_page);

        return 0;
}

ご覧のとおり、最新の OS では sysenter アプローチが好まれました。これは、int80 アプローチよりも高速だからです。(象徴的に、「vds32_syscall_start」は int80 にフォールバックします)。

于 2014-04-07T00:54:18.427 に答える
1

面白いことに、あなたのインターネット検索では、stackoverflow.com を検索するとは思いもしませんでした: __kernel_vsyscall とは何ですか?

より具体的な質問に答えるには、シンボル自体が (x86 の場合) arch/x86/vdso で定義されているようです。Cではなくアセンブリです。

于 2012-10-16T00:18:51.433 に答える