gpt4 book ai didi

c - 使用 "int 0x80"调用 Linux 内核系统调用

转载 作者:可可西里 更新时间:2023-11-01 11:44:12 37 4
gpt4 key购买 nike

我正在研究 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

最佳答案

对于 64 位系统,Linux 系统调用 ABI 与 i*86 完全不同,除非有一层兼容性。这可能有助于: http://callumscode.com/blog/3

我还在 eglibc 中找到了系统调用源,它看起来确实不一样: http://www.eglibc.org/cgi-bin/viewvc.cgi/trunk/libc/sysdeps/unix/sysv/linux/x86_64/syscall.S?view=markup

因此看起来 int $0x80 不适用于 x86_64 Linux 内核,您需要改用 syscall

关于c - 使用 "int 0x80"调用 Linux 内核系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12796458/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com