simple_read_from_buffer
и simple_write_to_buffer
- это просто удобные оболочки вокруг copy_{to,from}_user
, когда все, что вам нужно сделать, это обслужить read
из пользовательского пространства из буфера ядра или обслужить write
из пользовательского пространства в буфер ядра. .
Насколько я понимаю, функции copy_..._user
более безопасны.
Ни одна из версий не является «более безопасной», чем другая. Может ли один быть более безопасным, чем другой, зависит от конкретного варианта использования c.
Я бы сказал, что simple_{read,write}_...
в целом может быть более безопасным, поскольку они все соответствующие чеки перед копированием. Если все, что вам нужно сделать, это обслужить чтение / запись в / из буфера ядра, тогда использование simple_{read,write}_...
, безусловно, быстрее и менее подвержено ошибкам, чем ручная проверка и вызов copy_{from,to}_user
.
Хороший пример где simple_read_from_buffer
полезно:
#define SZ 1024
static char kernel_buf[SZ];
static ssize_t dummy_read(struct file *filp, char __user *user_buf, size_t n, loff_t *off)
{
return simple_read_from_buffer(user_buf, n, kernel_buf + off, kernel_buf, SZ - off);
}
Трудно сказать, что именно вам нужно, не видя кода вашего модуля, но я бы сказал, что вы можете либо:
- Используйте
copy_{from,to}_user
, если вы хотите контролировать точное поведение вашей функции . - Используйте
return simple_{read,write}_...
, если вам не нужен такой мелкозернистый элемент управления, и вы можете просто вернуть стандартные значения, созданные этими оболочками.