Как передать struct в системный вызов, а затем скопировать данные ядра в эту структуру - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь передать структурный указатель на пользовательский системный вызов, а затем скопировать данные ядра в пространство пользователя.

Моя главная проблема заключается в том, что у меня возникают проблемы с отладкой в ​​том месте, где проблема. Это может быть объяснено тем фактом, что я довольно плохо знаком с языком программирования C и одновременно изменяю исходный код ядра.

До сих пор я пробовал следующее:

struct (просто упрощенная версия фактической, которую использует программа пользовательского пространства (mystruct.h)):

struct mystruct {
    pid_t pid;
        //...
};

Мой собственный вызов:

struct mystruct {
    pid_t pid;
        //...
};

asmlinkage long sys_mysyscall(struct mystruct __user *userStructPtr){
    struct mystruct kernelData;

    if(!userStructPtr){
        return -EFAULT;
    }

    //Insert kernel data into struct
    kernelData.pid = current->pid;
    //...

    //Copy kernelData to userStructPtr (user space)
    if(copy_to_user(userStructPtr, &kernelData, sizeof(kernelData))){
        return -EFAULT;
    }

    return 0;
}

И, наконец, моя программа, которая тестируетэто:

int main (void) {
    struct mystruct userStruct;
    printf("%ld\n", syscall(sys_mysyscall, &userStruct));
    printf("PID: %d\n", userStruct.pid);
        return 0;
}

Я старался отлаживать как можно лучше. Таким образом, я знаю, что могу успешно вызвать свой системный вызов (благодаря printk), но он возвращает -1. Кроме того, я знаю, что данные, которые я вставляю в kernelData, хороши (например, current-> pid выдает правильный PID). Вывод моей тестовой программы не совпадает с данными, вставленными в kernelData.

Поэтому я не могу найти причину сбоя copy_to_user.

Любой ответ будет принят с благодарностью.

...