3

私は Linux カーネルを研究しており、現在、独自のシステム コールを実装しようとしています。

カーネル コードでは、次のようになります。

asmlinkage long sys_my_syscall()
{
     printk("My system call\n");
     return 0;
}

関数で呼び出すとsystemcall()正常に動作しますが、別の方法を見つけました:

int my_syscall(void)
{
    long __res;
    __asm__ volatile (
    "movl $312, %%eax;"
    "int $0x80;"
    "movl %%eax, %0;"
    : "=m" (__res)
    :
    : "%eax"
    );
    if ((unsigned long) (__res) >= (unsigned long) (-125)) {
       errno = -(__res);
       __res = -1;
    }
    return (int)(__res);
}

しかし、それは値を返します-14 EFAULT

私は何を間違っていますか?

セットアップ: Linux カーネル 3.4、ARCH x86_64

4

2 に答える 2

5

64 ビット システムの場合、Linux システム コールの ABI は、互換性のレイヤーがない限り、i*86 のシステム コールとはまったく異なります。これは役立つかもしれません: http://callumscode.com/blog/3

また、eglibc で syscall ソースを見つけましたが、実際には異なって見えます: http://www.eglibc.org/cgi-bin/viewvc.cgi/trunk/libc/sysdeps/unix/sysv/linux/x86_64/syscall.S ?view=マークアップ

そのint $0x80ため、x86_64 Linux カーネルでは機能しないようsyscallです。代わりに使用する必要があります。

于 2012-10-09T10:19:58.760 に答える