Я пытаюсь передать структурный указатель на пользовательский системный вызов, а затем скопировать данные ядра в пространство пользователя.
Моя главная проблема заключается в том, что у меня возникают проблемы с отладкой в том месте, где проблема. Это может быть объяснено тем фактом, что я довольно плохо знаком с языком программирования 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.
Любой ответ будет принят с благодарностью.