gpt4 book ai didi

linux - 无法按名称调用系统调用

转载 作者:太空狗 更新时间:2023-10-29 11:18:44 25 4
gpt4 key购买 nike

我正在为 linux Kernel 3.19 添加系统调用。尝试使用以下方法在 Ubuntu 14.04 LTS 中为 x86 arch 添加系统调用“add”。src=3.19 来源

  1. 向 src/arch/x86/syscalls/syscall_64.tbl 添加条目。

    323 common add sys_add
  2. 将系统调用原型(prototype)添加到 src/include/syscalls.h。

    asmlinakge sys_add(int i,int j);
  3. fs目录下编写了add.c,在fs/Makefile中添加了add.o .

  4. 在文件 src/include/uapi/asm-generic/unistd.h

添加的行

    #define __NR_add 323

__SYSCALL(__NR_add, sys_add);
  1. 编译并构建了内核。这是成功的。 uname -r 的输出为 3.19。

  2. 创建了一个程序来测试新的系统调用。

    6.1 使用函数 syscall(323,10,15)。成功打印了 values(25) 的总和。

    6.2 当尝试按名称调用系统调用时,它给出

      /tmp/ccpxRp8C.o: In function `main':
    testadd1.c:(.text+0x18): undefined reference to `add'
    collect2: error: ld returned 1 exit status

我错过了什么??

最佳答案

您遗漏了一小段汇编代码,这些代码在汇编时显示为 C 链接符号。

如果你这样做:

ar t /usr/lib/libc.a | grep write.o

您会看到(可静态链接的)C 库有一个名为“write.o”的小文件。这包含一小段汇编代码,定义了一个在 write.o 之外可见的符号 __libc_write。那段汇编代码将值 1 放入特定的寄存器中,这是 Linux 和 Unix 内核称为“写入”系统调用的编号,非常仔细地设置其他寄存器,然后执行 syscall 说明(在我的 x86_64 机器上)。

您必须为“添加”系统调用创建这样一段汇编代码。或者,您可以使用 syscall 系统调用,就像您一直在做的那样,编写一个普通的 C 函数,让它看起来就像您拥有一个 add() 系统打电话。

您没有说明您使用的是什么架构(x86 或 x86_64),但这是 write(2) 的 x86_64 实现。它确实正确设置了 errno,并返回写入的字节数,但参数类型不正确。

int
linux_write(int fd, const void *data, unsigned long len)
{

long ret;
asm volatile ("syscall" : "=a" (ret) : "a" (__NR_write),
"D" (fd), "S" (data), "d" (len) :
"cc", "memory", "rcx",
"r8", "r9", "r10", "r11" );
if (ret < 0)
{
errno = -ret;
ret = -1;
}
return (int)ret;
}

关于linux - 无法按名称调用系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28819548/

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