Доброго времени суток всем читающим!
Возник вот такой вопрос, а толкового ответа я (пока) не нагуглил. Имеем модуль ядра Linux 2.6, который делает нам символьное устройство. Ему, в функцию read, как положено, передается указатель
char __user *user_buffer. Естественно, для копирования туда данных нужно использовать copy_to_user. Возникает вопрос — а если мне надо копировать не с самого начала буфера? Или, например, из реального устройства я хочу читать небольшими кусками и копировать их в пользовательский буфер, как-то так (проверка ошибок здесь поскипана для краткости):
while (length)
{
int chunk_length = length > sizeof(kernel_buffer) ? sizeof(kernel_buffer) : length;
hw_read(kernel_buffer, chunk_length);
copy_to_user(user_buffer, kernel_buffer, chunk_length);
user_buffer += chunk_length; /* ведь указатель - это просто число, не? */
length -= chunk_length;
}
Можно ли применять к user_buffer адресную арифметику, или это прямой путь к kernel panic?
Заранее благодарю за помощь
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
_>Можно ли применять к user_buffer адресную арифметику, или это прямой путь к kernel panic?
можно
если погрепать сорцы кернела на copy_to_user то в первом же найденном файле можно увидеть чо-нть такое:
if (copy_to_user(name + 0, utsname()->sysname, 32))
goto out;
if (copy_to_user(name + 32, utsname()->nodename, 32))
goto out;
if (copy_to_user(name + 64, utsname()->release, 32))
goto out;
if (copy_to_user(name + 96, utsname()->version, 32))
goto out;
if (copy_to_user(name + 128, utsname()->machine, 32))
goto out;