2015-03-26 3 views
1

Как известно, список рассеяния собирает память, физически разбросанную по памяти, но практически непрерывную. При общении с DMA он предоставляет абстрагированное представление памяти для DMA, так как это физическая память.Как работает «список рассылок» в Linux?

Как scatterlist справиться с этим? Является ли это связанным списком, поддерживаемым в пределах scatterlist?

например, если имеется 4000 байтов данных, которые должны быть переданы с использованием DMA, поскольку данные физически смежны, поскольку список рассеяния делает его смежным? будет ли реализация разметки распределять 4000 байтов данных с использованием Kmalloc, чтобы убедиться, что она получает физически смежную память? или будет создать связанный список?

Примечание: здесь мой запрос не о таблице SG, но об индивидуальном scatterlist

позволяют нам день данные хранятся данные о 4000 байт физически несмежных памяти

struct scatterlist sg, 
sg_init_one(&sg,data,4000) 

Теперь, как это ГГ решает проблему?

BR, & Sanumala

+0

В вашем примере, как распределяется «данные»? :) – simurg

+0

данные могут поступать из пользовательского пространства или из других интерфейсов ядра, но гарантируется, что данные поступают в список рассылок. в отношении распределения у нас нет никакого контроля, это может быть от malloc (пользовательское пространство) или kmalloc (пространство ядра) и т. д. – sanumala

ответ

3

Кажется, вы смешиваете два разных списка разброса, т.е. struct scatterlist в Linux ядра и список разброса, которые могут быть поддержаны с помощью отдельного контроллера DMA. В обоих случаях они не смежны. Это похоже на массив в первом случае и связанный список во втором. Когда вы вызываете dmaengine_prep_slave_sg(), фактический драйвер DMA преобразует его во внутреннюю структуру, которая может быть копией списка SG, новый список SG, который соответствует максимальным границам длины DMA, связанный список DMA hw и т. Д. В зависимости от драйвера DMA (давайте рассмотрим недавно добавленные драйверы /dma/hsu/hsu.c), внутренний список SG будет скопирован и отправлен на HW в кусках не более чем на 4 дескриптора hw hw, после завершения каждого блока он получит прерывание и продолжение, если начальное количество элементов больше 4, пока все не будет отправлено/получено.

+0

в случае, если мне нужно «получить список физических адресов» (несмежных в ОЗУ) от разброса список, как я могу это сделать? потому что мне нужно получить этот физический адрес буферов. Это что-то ниже: EX: int i, count = pci_map_sg (dev, sglist, nents, direction); struct scatterlist * sg; для (i = 0, sg = sglist; i sanumala

+0

Я понятия не имею, зачем вам нужно * физическое * адреса здесь, но в 'scatterlist' у вас есть * виртуальный * адрес, сопровождающий * шинный * адрес. Адрес шины - это то, что вы получаете от 'sg_dma_address (sg)', и оно гарантировано в памяти DMA. – 0andriy

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