添加带有参数的系统调用到FreeBSD内核

时间:2011-10-31 04:48:07

标签: kernel freebsd system-calls

我想在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

此代码有什么问题?

3 个答案:

答案 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。