2013-09-30 2 views
4

Я работаю над драйвером устройства, имеющим доступ к элементу списка рассеяния (sg). Я могу извлечь данные из него и сохранить его в выделенном буфере с помощью sg_copy_to_buffer. Теперь, моя идея - создать новый список рассеяния и скопировать из этого буфера в новый список рассеяния, который я создаю (конечно, это делается позже) и вернуть этот новый список рассеяния обратно в ядро. (Это для показателей производительности и т. Д.) Я пробовал искать в Интернете документацию, чтобы использовать список рассылок и т. Д., Но безрезультатно. Что я обычно делаю:Список рассыпных сборок в драйвере драйвера ядра Linux

char *buffer = kmalloc (***); 
struct scatterlist *sglist = kmalloc (sizeof (struct scatterlist)...); 
sg_init_one(sglist, buffer, BUFFER_SIZE); 

sg_copy_to_buffer (inp_sglist, inp_sglist_len, buffer); 

*** Later *** 
sg_copy_from_buffer (sglist, 1, buffer); 

Есть хорошая документация, чтобы помочь мне карту мой scatterlist в виртуальный буфер? Я пытался смотреть на http://lwn.net/Articles/256368/ http://www.linuxjournal.com/article/7104 т.д.

Любая помощь или указатели будут оценены!

ответ

1

Обычно пользователь выделяет буфер в своей виртуальной памяти, а затем вызывает драйвер устройства. Когда пользователь выдает запись, вы получаете sglist для буфера с данными записи и используете его в sg_copy_to_buffer(). Когда пользователь выдает сообщение, вы получаете список sglist для считываемого буфера данных и используете его в sg_copy_from_buffer().

Звонок для получения sglist из запроса ввода-вывода описан в статье. Это хорошая статья, но почти 10 лет. Многие системы x86 теперь имеют IOMMU для поддержки виртуализации оборудования.

Обычно драйверы устройств используют sglist для генерации списка операций ввода-вывода устройства, по одному для каждого непересекающегося блока данных в записи sglist, а не для копирования данных в локальный буфер.

 Смежные вопросы

  • Нет связанных вопросов^_^