2017-02-10 7 views
0

Я много работаю над этим, но не добился какого-либо прогресса.Как отправить динамические массивы copy_to_user в (Модуль ядра)

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

Статические или фиксированные переменные, такие как int a, char b [100], отлично работают с put_user или copy_to_user. однако, когда я пытаюсь передать указатель, syscall убивается или имеет ошибку.

Можно ли отправлять динамические массивы с помощью copy_to_user? Я пытался решить это сам в течение нескольких недель, но я отчаянно нуждаюсь в помощи и смиренно прошу вашего руководства.

спасибо.

ответ

0

В пользовательском пространстве,

memcpy(&data.items, ...) 

не работает: это переписывает хранение data_t.items поля, а не массив это указывает на. Но это именно то, что пытается сделать ваш код ядра.

Вместо этого вы хотите скопировать в память, на которую указывает items. Это выглядит как

memcpy(data.items, ...) 

в пользовательском пространстве и

void *user_items; 
get_user(&user_items, &from->items); 
copy_to_user(user_items, ...); 

в ядре, как вам нужно прочитать значение поля первой.

+0

Спасибо за ответ, но я не понимаю memcpy [data.items, ...], где мы его используем и назначаем? –

+0

@SunghoHong 'copy_to_user (& from-> items, ...)' эквивалентно 'memcpy (& data.items, ...)'. Надеюсь, что очевидно, почему второй ошибается, и по аналогии понимает, почему первое неправильно. – ephemient

+0

Нет, нет необходимости в 'kmalloc' какой-либо дополнительной памяти в ядре. У вас уже есть массив 'items', вам просто нужно скопировать его в нужное место - вы сейчас скопируете его в неправильное место. – ephemient