Мой системный вызов не работает должным образом - PullRequest
0 голосов
/ 21 ноября 2010

Мне нужно создать 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();
}

Ответы [ 3 ]

6 голосов
/ 21 ноября 2010

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

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

Об этом:

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

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

0 голосов
/ 22 ноября 2010

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

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

при условии, что это не так

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

...