Ton*_*osi 5 c linux linux-kernel
我已经在我的 Linux 内核中定义了一个“helloworld”系统调用并重新编译了它。系统调用的代码是:
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/sched.h>
#include<linux/syscalls.h>
#include "processInfo.h"
asmlinkage long sys_listProcessInfo(void)
{
printk("Hello World. My new syscall..FOSS Lab!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从具有另一个内核版本(不包括此系统调用)的同一操作系统调用此系统调用时,请使用以下代码:
#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main()
{
long int var = syscall(326);
printf("Returning: %ld\n",var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该变量var的值为 -1。我想知道如何var获取 -1 而不是显示错误。
为什么会出现错误?该syscall函数存在,链接器可以解析它。因此编译器或链接器不会出现错误。当您运行可执行文件时,旧内核的syscall函数检测到 326 是无效的系统调用号,并且函数返回 -1,可能设置errno为ENOSYS= 系统调用未实现。