2010-11-21 4 views
0

Мне нужно создать 2 новых системных вызова для установки и получения свойства из процесса данным pid. Я изменил task_struct, добавил int z_value (это то, что мне нужно установить/получить)Мой системный вызов не работает должным образом

Мне также удалось установить значение по умолчанию z_value (200) для каждого созданного процесса.

Когда я запустил системный вызов, я вижу корректное значение z_value по умолчанию. Но когда я пытаюсь установить z_value, ничего не происходит.

Нет Компиляция ошибок, сегментация не придираться и т.д.

Вот мой набор системных вызовов.

#include <linux/kernel.h> 
#include <linux/sched.h> 
#include <linux/uaccess.h> 

asmlinkage void sys_set_z_value (int user_value , pid_t pid) 
{ 


    rcu_read_lock(); 

    struct task_struct *p = find_task_by_vpid(pid); 

    p->z_value = user_value; 

    rcu_read_unlock(); 
} 
+0

Не можете ли вы расширить существующий вызов, например prctl? Альтернативно, напишите char-устройство с некоторыми ioctls, которые выполняют функцию? – MarkR

ответ

6

Ваш звонок copy_from_user не имеет смысла. Нет указателя на используемую память. user_value - это значение, а не указатель. (Если вы предназначались для этого указателя, вам нужно исправить связанные типы, но похоже, что вы передаете этот int по значению в syscall.) Просто назначьте p->z_value = user_value;.

+0

+1. Я заметил путаницу в значении/указателе, но не был уверен, что здесь требуется «copy_from_user». –

+0

Кстати, я никогда не писал и почти никогда не читал код ядра Linux, поэтому мой ответ основан только на логическом чтении имени функции 'copy_from_user' и типов и аргументов. Надеюсь, это правильно. :-) –

+0

@melih: Да, вот что я думаю. 'copy_from_user' почти наверняка ошибочен. –

2
  • Ваш syscall должен вернуть тип long.
  • Вы должны использовать макросы SYSCALL_DEFINE2().
  • Вашего код не должен компилироваться без предупреждений (и декларирование p типа в середине функции вызовет предупреждение)
  • Если вы получаете неверный идентификатор процесса, ваша p переменное будут NULL, и вы должны вернуться -ESRCH

Об этом:

Мне также удалось установить z_value по умолчанию (200) для каждого созданного процесса.

Я надеюсь, что вы позаботились и о init_task, это распространенная ошибка.

0

Два предложения:

1) Представьте намеренную ошибку, как некоторые случайные символы в исходном файле и убедитесь, что сборка ядра не удается. Его удивительное количество проблем, которые сводятся к коду, который вы добавляете, не строится.

при условии, что не было его

2) Загрузите ваш код с большим количеством printk, так что вы можете увидеть, что он пытается сделать, либо смотреть в окно консоли или вызова dmesg после того как вы запустите его. Поместите их повсюду, чтобы проверить каждое предположение, что код работает, что переменные - это то, что вы думаете, и т. Д.

Смежные вопросы