Kernel 如何从FreeBSD系统调用返回0以外的内容

Kernel 如何从FreeBSD系统调用返回0以外的内容,kernel,return-value,freebsd,system-calls,Kernel,Return Value,Freebsd,System Calls,我已经编写了一个syscall,它在我前面添加的td_sched中设置了一个变量 #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> #

我已经编写了一个syscall,它在我前面添加的td_sched中设置了一个变量

#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>
#include <sys/sched.h>
#include <sys/lock.h>
#include <sys/mutex.h>


struct set_proc_args{
    pid_t pid;
    struct timeval WCET;
    struct timeval deadline;
};

static int set_process_slack(struct thread *tda ,struct set_proc_args * arg){

    struct proc * process = pfind(arg->pid);
    struct thread* td = FIRST_THREAD_IN_PROC(process);

    if(process == NULL)
    {
        tda->td_retval[0] = -1;
        return -1;
    }


    if(td == NULL)
    {
        tda->td_retval[0] = -1;
        return -1;
    }
    PROC_LOCK_ASSERT(process, MA_OWNED);
    td->td_sched->WCET = (1000000 * arg->WCET.tv_sec + arg->WCET.tv_usec);
    td->td_sched->deadline =(uint64_t)( 1000000 * arg->deadline.tv_sec+arg->deadline.tv_usec);
    td->td_sched->slack_mode = 1;
    PROC_UNLOCK(process);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构集\u过程\u参数{
pid_t pid;
结构timeval-WCET;
结构timeval截止日期;
};
静态整数集\u进程\u松弛(结构线程*tda,结构集\u进程*args*arg){
struct proc*process=pfind(参数->pid);
struct thread*td=进程中的第一个线程;
if(进程==NULL)
{
tda->td_retval[0]=-1;
返回-1;
}
if(td==NULL)
{
tda->td_retval[0]=-1;
返回-1;
}
进程锁断言(进程,MA_拥有);
td->td_sched->WCET=(1000000*arg->WCET.tv\u sec+arg->WCET.tv\u usec);
td->td_sched->deadline=(uint64_t)(1000000*arg->deadline.tv_sec+arg->deadline.tv_usec);
td->td\u sched->slack\u mode=1;
过程解锁(过程);
返回0;
}
因此,当找不到具有此ID的进程时,我希望返回-1。 我已经测试并看到,当找到进程时,代码正在工作 但如果找不到,FreeBSD将重新启动 问题在哪里?
实际上,我不知道如何正确返回-1。

我愿意用我辛苦赚来的钱打赌,这是因为:

struct proc * process = pfind(arg->pid);
struct thread* td = FIRST_THREAD_IN_PROC(process);
if(process == NULL) {
    tda->td_retval[0] = -1;
    return -1;
}
在不存在此类流程的情况下,
pfind
将根据以下规则返回NULL:

pfind()和zpfind()成功时返回指向proc结构的指针,失败时返回NULL。

_PROC函数或宏中的
第一个线程几乎肯定会尝试取消对
进程的引用
以找到它的第一个线程

由于
process
为空,因此取消引用将导致核心转储。或者,更准确地说,如果您只是作为一个普通进程运行,内核可能会丢弃它,那么它将导致内核转储

这在系统调用中的事实要严重得多,因此需要重新启动。内核级代码必须比用户级代码更无bug

尝试重新排列上面的代码,以便在尝试使用它之前检查
process
是否有空值,例如:

struct proc * process = pfind(arg->pid);
struct thread* td;
if(process == NULL) {
    tda->td_retval[0] = -1;
    return -1;
}
td = FIRST_THREAD_IN_PROC(process);