Здравствуйте, unkn2000, Вы писали:
U>Здравствуйте, Murr.
U>Я этот же вопрос задал на соседней ветке ( низкоуровневое программирование ).
U>http://www.rsdn.ru/Forum/Message.aspx?mid=483272#483272Автор: unkn2000
Дата: 18.12.03
U>Мне ответили, но что-то не получается. Не могли бы вы помоч разобраться.
Как работает драйвер блочного устройства?
Вы регистрируете устройство, при открытии inode передается управление в вашу функцию open.
Вы определяете для переданной inode операции a_ops (inode->i_mapping->a_ops), конкретнее — direct_IO.
Если Ваше устройство открывается в режиме O_DIRECT, то при чтении используется callback direct_IO.
В качестве примера реализации для блочного ввода-вывода просто посмотрите fs/buffer.c:generic_direct_IO.
То есть фактически Вам на вход подается массив pinned страниц — вам только остается посчитать физический адрес каждой страницы и подать на устройство. Чтобы получить физический адрес скорее всего достаточно воспользоваться макросом page_to_phys (вроде бы должно работать даже на NUMA/DISCONTIG).
P.S. Попробуйте написать

Если есть какие-то вопросы — я отвечу в меру своих знаний.