私は 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