Мой системный вызов не работает должным образом

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

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

Когда я запускаю системный вызов get, я вижу, что 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();
}

person melih    schedule 21.11.2010    source источник
comment
Нельзя ли расширить существующий вызов, например prctl? В качестве альтернативы напишите символьное устройство с некоторыми ioctl, которые выполняют эту функцию?   -  person MarkR    schedule 21.11.2010


Ответы (3)


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

person R.. GitHub STOP HELPING ICE    schedule 21.11.2010
comment
+1. Я заметил путаницу между значением и указателем, но не был уверен, нужен ли здесь copy_from_user. - person Fred Foo; 21.11.2010
comment
Кстати, я никогда не писал и почти никогда не читал код ядра Linux, поэтому мой ответ основан просто на логическом прочтении имени функции copy_from_user и задействованных типов и аргументов. Надеюсь, однако, что это правильно. :-) - person R.. GitHub STOP HELPING ICE; 21.11.2010
comment
@melih: Да, я так думаю. copy_from_user по крайней мере почти наверняка неверен. - person R.. GitHub STOP HELPING ICE; 21.11.2010
comment
@melih: учитывая, что пользовательский ввод доступен как параметр типа int, он уже находится в пространстве ядра. Необходимо скопировать только входные данные указателя (пути и т. д.). ibm.com/developerworks/linux/library/l-system-calls - person Fred Foo; 21.11.2010
comment
Я удалил copy_from_user, но это не сработало. Я думаю, что мне следует больше читать о процессах, все равно спасибо - person melih; 21.11.2010

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

Об этом:

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

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

person Nicolas Viennot    schedule 22.11.2010

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

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

если предположить, что это не так

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

person Chris Stratton    schedule 22.11.2010