我想在FreeBSD 8.2中使用KLD添加一个系统调用,它有一些参数(这里有1个参数) 我已经完成了以下操作(我实际上已经更改了/usr/share/examples/kld/syscalls/module/syscall.c中的syscall.c)
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/module.h>
#include <sys/sysproto.h>
#include <sys/sysent.h>
#include <sys/kernel.h>
#include <sys/systm.h>
struct hellomet_args{
int a;
};
static int
hellomet(struct thread *td, struct hellomet_args *arg)
{
int a = arg->a;
printf("hello secondish kernel %d \n",a);
return (0);
}
static struct sysent hellomet_sysent = {
1,
hellomet
};
static int offset = NO_SYSCALL;
static int
load(struct module *module, int cmd, void *arg)
{
int error = 0;
switch (cmd) {
case MOD_LOAD :
printf("syscall loaded at %d\n", offset);
break;
case MOD_UNLOAD :
printf("syscall unloaded from %d\n", offset);
break;
default :
error = EOPNOTSUPP;
break;
}
return (error);
}
SYSCALL_MODULE(hellomet, &offset, &hellomet_sysent, load, NULL);
当我使用模块目录中提供的Makefile创建此文件时,我得到:
cc1: warnings being treated as errors syscall.c:56: warning: initialization from incompatible pointer type
*** Error code 1
Stop in /usr/share/examples/kld/syscall/module.
*** Error code 1
此代码有什么问题?
答案 0 :(得分:4)
您正在使用与typedef不匹配的函数指针初始化sy_call
hellomet_sysent
成员。 sy_call
的类型为sy_call_t
,其定义为采用(struct thread* , void*)
并返回int
的函数。您的来电需要(struct thread*, struct hellomet_args *)
。
尝试这样的事情:
static struct sysent hellomet_sysent = {
1,
(sy_call_t*) hellomet
};
答案 1 :(得分:0)
尝试从
更改系统调用的签名static int
hellomet(struct thread *td, struct hellomet_args *arg)
到
static int
hellomet(struct thread *td, void *arg)
然后,在系统调用的正文中
...
struct hellomet_args *uap;
uap = (struct hellomet_args *)arg;
...
答案 2 :(得分:0)
您也可以添加
NO_WERROR=
进入你的Makefile。