Linux: Адресная арифметика в модуле ядра
От: slava_phirsov Россия  
Дата: 23.10.14 09:51
Оценка:
Доброго времени суток всем читающим!

Возник вот такой вопрос, а толкового ответа я (пока) не нагуглил. Имеем модуль ядра 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?

Заранее благодарю за помощь
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.