システム コールの作成に使用される Linux カーネル内の __kernel_vsyscall メソッドを探しています。コードを観察して詳細を確認したいのですが、grep検索ではそれを見つけることができず、インターネット上でその場所を見つけることができません。誰かが私にそれがどこにあるかを正確に指摘できますか? そして、それは操作できますか?
助けてくれてありがとう!
システム コールの作成に使用される Linux カーネル内の __kernel_vsyscall メソッドを探しています。コードを観察して詳細を確認したいのですが、grep検索ではそれを見つけることができず、インターネット上でその場所を見つけることができません。誰かが私にそれがどこにあるかを正確に指摘できますか? そして、それは操作できますか?
助けてくれてありがとう!
現在のディレクトリが 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 にフォールバックします)。
面白いことに、あなたのインターネット検索では、stackoverflow.com を検索するとは思いもしませんでした: __kernel_vsyscall とは何ですか?
より具体的な質問に答えるには、シンボル自体が (x86 の場合) arch/x86/vdso で定義されているようです。Cではなくアセンブリです。