URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7287
[ Назад ]

Исходное сообщение
"Семантика read из device driver-а (Рубини и LDD3)"

Отправлено geekkoo , 03-Апр-08 13:43 
Продолжаю читать Linux Device Drivers 3 ed

Вопрос про чтение фиксированного числа отсчетов из драйвера. Данные прибывают квантами по 4096 байт. Если пользователь запросил из драйвера точно 128 кБайт, что должен делать драйвер? Хотелось бы, чтобы драйвер попеременно спал и получал данные до тех пор пока не наберётся запрошенное юзером число байт.

Но Рубини в 6 Главе утверждает, что это не соглачуется с юниксной семантикой, а правильное поведенеие должно быть таким:

If a process calls read but no data is (yet) available, the process must block. The process is awakened as soon as some data arrives, and that data is returned to the caller, even if there is less than the amount requested in the count argument to the method.

Как в этом случае выходить из положения? Буферизовать данные в user-land? Хочется ятобы последовательность собранных данных была непрерывной.


Содержание

Сообщения в этом обсуждении
"Семантика read из device driver-а (Рубини и LDD3)"
Отправлено vshemm , 04-Апр-08 12:06 
>Продолжаю читать Linux Device Drivers 3 ed

А в чем вопрос? Вы сами все случаи описали. Можно сделать как говорит Рубини, тогда придется в юзерспейсе читать в цикле пока не наберется 128к. Можно этот цикл переместить в драйвер, и ждать там, пока не наберется нужное количество данных. Причем записывать их можно как в юзерский буфер (что не очень хорошо, при получении сигнала буфер будет изменен), так и в ядерный буфер (что тоже нехорошо, т.к. при каждом запросе на чтение его нужно будет выделять-освобождать).
Имхо, лучше не менять семантику read() и делать как говорит Рубини :)


"Семантика read из device driver-а (Рубини и LDD3)"
Отправлено geekkoo , 04-Апр-08 12:50 
>[оверквотинг удален]
>семантикой, а правильное поведенеие должно быть таким:
>
>If a process calls read but no data is (yet) available, the
>process must block. The process is awakened as soon as some
>data arrives, and that data is returned to the caller, even
>if there is less than the amount requested in the count
>argument to the method.
>
>Как в этом случае выходить из положения? Буферизовать данные в user-land? Хочется
>ятобы последовательность собранных данных была непрерывной.

Ага, это в третьей главе обсуждалось, я пропустил. Нужно просто в вызове read возвращать число фактически переданных байт. Тогда при чтении девайса с помощью библиотечной функции fread пользователь даже не заметит квантования, поскольку система будет повторять чтение с девайса пока не наберётся запрошенное число байт.