2012-04-03 3 views
2

Я всегда думал, что copy_to_user был необходим, когда ядро ​​записывает пользователям через procfs.Требуется ли copy_to_user с procfs?

Я забыл сделать это один раз, хотя (и я использовал snprintf), и все было хорошо. Теперь, когда я это заметил, я искал. Я нашел this link, который не говорит, что copy_to_user необходим, хотя для другого раздела (чтение ядра от пользователя) он говорит, что необходимо copy_from_user.

Итак, буфер, предоставленный модулю ядра для записи данных (поэтому пользователь читает с него), в пространстве ядра уже? Это правда, что вам не нужно copy_to_user при написании через procfs? Или мне повезло не попасть в крушение?

+0

Wihtout, видя ваш фактический код, трудно сказать. Я подозреваю, что часть copy_to_user выполняется машиной procfs при чтении буфера. – stsquad

+0

@stsquad, это тоже мое подозрение, но я был удивлен этим. Я имею в виду, если ядро ​​выполняет 'copy_to_user', почему оно вообще существует? – Shahbaz

ответ

2

Всегда используйте copy_from_user и copy_to_user при работе с указателями пространства пользователя. Даже если простой memcpy иногда работает для вас, есть ситуации, когда он может выйти из строя. См. this поток информации.

Говоря о procfs, необходимо учитывать, что он использует небольшой трюк с предварительным распределением памяти ядра. См. Ссылку this для получения более подробной информации.

+0

Спасибо! Ссылка на читатель/proc была действительно полезна и обсуждение довольно интересно – Shahbaz

+0

FYI, 'copy_to_user' всегда терпел неудачу для меня. В случае, столь же простом, как 'char str [7] =" ABCDEF "; ret = copy_to_user (страница + смещение, str, 7); 'всегда возвращается' 7'. Дело в том, что в соответствии с тем же кодом, на который вы указали мне, я действительно не получаю указатель на пользователя, но я всегда думал, что copy_to_user будет понимать и игнорировать указатели на ядро. Тем не менее ядро ​​явно вызывает 'copy_to_user', поэтому я был вынужден удалить его. – Shahbaz

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