Я пытаюсь написать системный вызов, который может получить информацию о процессе в 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.