Unix 在FreeBSD 10.1中添加新的系统调用

Unix 在FreeBSD 10.1中添加新的系统调用,unix,kernel,system-calls,freebsd,Unix,Kernel,System Calls,Freebsd,我想在FreeBSD添加新的系统调用。我的系统调用代码是: #include <sys/types.h> #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> #include <sys/proc.h> #include <sys/mount.h> #include <sys/sysproto.h> int Sum(int a

我想在FreeBSD添加新的系统调用。我的系统调用代码是:

#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/mount.h>
#include <sys/sysproto.h>

int Sum(int a, int b);

int
Sum(a,b)
{
   int c;
   c = a + b;
   return (0);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
整数和(整数a,整数b);
int
总数(a、b)
{
INTC;
c=a+b;
返回(0);
}
但是当我重建内核时,我有一个错误:

怎么了?你能帮我吗

非常感谢。

请阅读

我认为,您没有在内核makefile中包含带有
sys\u Sum
函数的文件(请注意,在您提供的代码中,函数名为
Sum
,并且错误地调用了
sys\u Sum
。我希望这只是代码中的一个输入错误,函数名为
sys\u Sum
).

请阅读


我认为,您没有在内核makefile中包含带有
sys\u Sum
函数的文件(请注意,在您提供的代码中,函数名为
Sum
,并且错误地调用了
sys\u Sum
。我希望这只是代码中的一个输入错误,函数名为
sys\u Sum
).

下面是我如何使用setkey的示例系统调用实现的,该调用使用两个未签名的int。 我将系统调用添加到end/kern/syscalls.master

546 AUE_NULL    STD { int setkey(unsigned int k0, unsigned int k1);}
然后我做到了

cd /usr/src
sudo make -C /sys/kern/ sysent
接下来,我将该文件添加到/sys/conf/files

kern/sys_setkey.c       standard
我的sys_setkey.c如下

#include <sys/sysproto.h>
#include <sys/proc.h>

//required for printf
#include <sys/types.h>
#include <sys/systm.h>

#ifndef _SYS_SYSPROTO_H_
struct setkey_args {
    unsigned int k0;
    unsigned int k1;
};
#endif
/* ARGSUSED */
int sys_setkey(struct thread *td, struct setkey_args *args)
{
    printf("Hello, Kernel!\n");
    return 0;
}
最后,在/usr/src/I中运行命令

sudo make -j8 kernel
sudo reboot
这是一个运行系统调用的程序

#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
int main(){
//syscall takes syscall.master offset,and the system call arguments
printf("out = %d\n",syscall(546,1,1));
return 0;
}
#包括
#包括
#包括
int main(){
//syscall接受syscall.master偏移量和系统调用参数
printf(“out=%d\n”,syscall(546,1,1));
返回0;
}

下面是我如何使用setkey的示例系统调用实现的,该调用使用两个未签名的int。 我将系统调用添加到end/kern/syscalls.master

546 AUE_NULL    STD { int setkey(unsigned int k0, unsigned int k1);}
然后我做到了

cd /usr/src
sudo make -C /sys/kern/ sysent
接下来,我将该文件添加到/sys/conf/files

kern/sys_setkey.c       standard
我的sys_setkey.c如下

#include <sys/sysproto.h>
#include <sys/proc.h>

//required for printf
#include <sys/types.h>
#include <sys/systm.h>

#ifndef _SYS_SYSPROTO_H_
struct setkey_args {
    unsigned int k0;
    unsigned int k1;
};
#endif
/* ARGSUSED */
int sys_setkey(struct thread *td, struct setkey_args *args)
{
    printf("Hello, Kernel!\n");
    return 0;
}
最后,在/usr/src/I中运行命令

sudo make -j8 kernel
sudo reboot
这是一个运行系统调用的程序

#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
int main(){
//syscall takes syscall.master offset,and the system call arguments
printf("out = %d\n",syscall(546,1,1));
return 0;
}
#包括
#包括
#包括
int main(){
//syscall接受syscall.master偏移量和系统调用参数
printf(“out=%d\n”,syscall(546,1,1));
返回0;
}

我的代码是真的还是假的?你能编辑你的问题,将代码和错误以纯文本的形式包括进来,而不是包括截图吗?@ajshort是的,我更改了:)无需ping其他用户(使用
你能帮我吗?
)。此外,引用
@
仅适用于当前讨论中的用户;例如,请看这里:我的代码是真的还是假的?你能编辑你的问题,将代码和错误以纯文本形式包含,而不是包含屏幕截图吗?@ajshort是的,我更改了:)无需ping其他用户(使用
你能帮我吗?
)。此外,引用
@
仅适用于当前讨论中的用户;如图所示:我在usr/src/sys/conf-->文件中输入我的syscall名称。。。这是真的吗?如果没有,我应该更改的Makefile目录在哪里?我说的是名为
Makefile
的文件。如果您不熟悉makefiles,请阅读一些有关它的教程(对于start-),我将在usr/src/sys/conf-->files中输入我的syscall名称。。。这是真的吗?如果没有,我应该更改的Makefile目录在哪里?我说的是名为
Makefile
的文件。如果您不熟悉makefiles,请阅读一些有关它的教程(对于start-)