Перенос данных из пространства ядра в пространство пользователя - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь написать системный вызов, который может получить информацию о процессе в Linux, но, как сказал заголовок, я не могу получить данные из пространства ядра. Это мой простой код, чтобы попытаться получить идентификатор моего студента из пространства ядра.

    struct procinfos {
       long studentID; //for the assignment testing
    };

SYSCALL_DEFINE2(get_proc_info,pid_t, pid, struct procinfos *, info){
            struct procinfos *info1;
            info1->studentID = 1612786;
            int err =(int)copy_to_user(&info->studentID,&info1->studentID,sizeof(info1->studentID));
            printk(KERN_INFO " err =  %d \n",err);
            //printk(KERN_INFO "My ID is %ld\n",info->studentID);
            printk(KERN_INFO " pid =  %d \n",pid); //pid here just for testing whether I pass data to syscall success or fail.
     return EINVAL;
    }

И это моя программа тестирования (test.c) в пространстве пользователя.

int main(){
   long sys_return_value;
   struct procinfos info;
   sys_return_value = syscall(548, -1, &info);
   printf("return of sys_get_proc_info is %ld\n",sys_return_value);
   printf("My student ID: %ld\n", info.studentID);
return 0;
}

Наконец, я получаю странное число (не мой идентификатор студента)

> return of sys_get_proc_info is 22 
My student ID: 94632846337520

Как я могу это исправить? Спасибо за чтение.

P / s:

  • Я пробовал memcpy (), но это не так просто, как copy_to_user ().
  • Я передаю "pid"syscall успешно.
  • Если я назначу непосредственно в моем системном вызове, как info-> studentID = 1612786 , мой test.c будет убит (я действительно не знаю почему).
  • Я использую Linux 5.0.5.
...