Как я могу вернуть что-то кроме 0 из системного вызова FreeBSD - PullRequest
3 голосов
/ 05 ноября 2011

Я написал системный вызов, который устанавливает переменную в 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;
}

Так что я хочу вернуть -1, когда не найден процесс с этим идентификатором. Я проверил и увидел, что код работает, когда процесс найден но если он не найден, FreeBSD перезагружается В чем проблема? На самом деле я не знаю, как правильно вернуть -1.

1 Ответ

2 голосов
/ 05 ноября 2011

Я был бы готов поспорить, что мои с трудом заработанные деньги из-за этого:

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 согласно manpage :

pfind() and zpfind() return a pointer to a proc structure on success and a NULL on failure.

Функция или макрос FIRST_THREAD_IN_PROC затем почти наверняка пытается разыменовать process, чтобы найти первый поток для него.

Поскольку process имеет значение NULL, разыменование вызовет дамп ядра. Или, вернее, вызовет дамп ядра, если вы просто работаете как обычный процесс, который ядро ​​может просто выбросить.

Тот факт, что это происходит в системном вызове, гораздо более серьезен, поэтому происходит перезагрузка. Вы должны быть далеко более безошибочными в коде уровня ядра, чем код уровня пользователя.

Попробуйте перестроить этот код выше так, чтобы вы проверяли process на значение NULL до , пытаясь его использовать, что-то вроде:

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);
...