Общая память между пользовательским пространством и потоками ядра - PullRequest
5 голосов
/ 27 октября 2011

Я занимаюсь разработкой приложения для ядра, которое использует kthreads.Я создаю массив структур и выделяю память, используя malloc в пространстве пользователя.Затем я вызываю системный вызов (который я реализовал) и передаю адрес массива в пространство ядра.В обработчике системного вызова, который я создаю, я создаю 2 kthreads, которые будут следить за массивом.kthread может изменять некоторые значения, а потоки в пользовательском пространстве также могут изменять некоторые значения.Идея состоит в том, чтобы использовать массив в качестве разделяемой памяти.Но некоторые, когда я обращаюсь к памяти в пространстве ядра (используя copy_from_user), данные как-то меняются.Я могу проверить, что адрес тот же, когда он был назначен и в ядре.Но при использовании copy_from_user он дает различные значения, такие как значения мусора.

Также хорошо ли следующее утверждение?

int kthread_run_function(void* data){
    struct entry tmp;
    copy_from_user(&tmp, data, sizeof(struct entry));
}

Ответы [ 2 ]

7 голосов
/ 28 октября 2011

Это не нормально, потому что copy_from_user() копирует из текущего пользовательского процесса (что должно быть очевидно, так как невозможно определить, из какого пользовательского процесса копировать).

В системном вызове, вызываемом процессом вашего пользовательского пространства, это нормально, потому что текущий процесс - это процесс вашего пользовательского пространства.Однако в потоке ядра текущий процесс может быть любым другим процессом в системе - поэтому вы копируете из памяти случайного процесса, поэтому вы получаете мусор.

Если вы хотите разделить память междуядро и пользовательский процесс, правильный способ сделать это - kernel выделить его, а затем разрешить процессу пользовательского пространства отобразить его в свое адресное пространство с помощью mmap().Поток ядра и процесс пространства пользователя будут использовать разные указатели для ссылки на область памяти - поток ядра будет использовать указатель на память, выделенную в адресном пространстве ядра, а процесс пространства пользователя будет использовать указатель на область памяти, возвращаемую mmap().

1 голос
/ 27 октября 2011

Нет, обычно это не так, поскольку data - это виртуальный адрес ядра, , а не - виртуальный адрес пользователя.

Однако, если вы вызвали kthread_create с аргументом dataравный указателю __user, все должно быть в порядке.

...