gpt4 book ai didi

c - 直接从用户程序访问系统调用

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

在 Ubuntu 上 - 内核 2.6.32.2

如何在没有任何库帮助的情况下直接从用户代码调用已经存在的系统调用?我在书籍和互联网上阅读以解决此问题,然后编写了以下代码但仍然出现错误。请帮忙

想找出当前进程的进程id

#include <stdio.h>
#include<linux/unistd.h> // for __NR_getpid
_syscall0(int, getpid)

int main() {
printf("Current Process ID : %d\n",getpid());
return 0;
}

编译时出错:

root@Omkant:~/os# gcc -Wall getpid.c -o getpid
getpid.c:5:16: error: expected declaration specifiers or ‘...’ before ‘getpid’
getpid.c:5:1: warning: data definition has no type or storage class
getpid.c:5:1: warning: type defaults to ‘int’ in declaration of ‘_syscall0’
getpid.c: In function ‘main’:
getpid.c:8:2: warning: implicit declaration of function ‘getpid’

代码中有什么问题?请帮助...

最佳答案

_syscall(2) 的联机帮助页指出:

Starting around kernel 2.6.18, the _syscall macros were removed from header files supplied to user space. Use syscall(2) instead. (Some architectures, notably ia64, never provided the _syscall macros; on those architectures, syscall(2) was always required.)

因此,您想要的方法无法在更现代的内核上运行。 (您可以清楚地看到,如果您在代码上运行预处理器。它不会解析 _syscall0 宏)尝试改用 syscall 函数:

这是一个用法示例,引用自 syscall(2):

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>

int
main(int argc, char *argv[])
{
pid_t tid;
tid = syscall(SYS_gettid);
}

当您要求在没有任何用户空间包装器的情况下直接调用 Linux 内核的方法时,我将向您展示 80386 和 amd64 架构的示例。

首先,您必须从表中获取系统调用号,例如this one .对于getpid,amd64 的系统调用号为39,80386 的系统调用号为20。接下来,我们创建一个为我们调用系统的函数。在 80386 处理器上,您使用中断 128 来调用系统,在 amd64 上,我们使用特殊的 syscall 指令。系统调用号进入寄存器 eax,输出也写入该寄存器。为了使程序更简单,我们用汇编编写。您稍后可以使用 strace 来验证它是否正常工作。

这是 80386 的代码。它应该返回其 pid 的最低字节作为退出状态。

        .global _start
_start: mov $20,%eax #system call number 20:
int $128 #call the system
mov %eax,%ebx #move pid into register ebx
mov $1,%eax #system call number 1: exit, argument in ebx
int $128 #exit

组装:

as -m32 -o 80386.o 80386.s
ld -m elf_i386 -o 80386 80386.o

这与 amd64 的代码相同:

        .global _start
_start: mov $39,%eax #system call 39: getpid
syscall #call the system
mov %eax,%edi #move pid into register edi
mov $60,%eax #system call 60: exit
syscall #call the system

组装:

as -o amd64.o amd64.s
ld -o amd64 amd64.o

关于c - 直接从用户程序访问系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219501/

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