Как работает "scatterlist" в linux?
Как мы знаем, список разброса собирает память, физически разбросанную по всей памяти, но, тем не менее, практически непрерывную. При взаимодействии с DMA он обеспечивает абстрактное представление памяти для DMA, поскольку это физически является непрерывной памятью.
Как scatterlist
справиться с этим? Это своего рода связанный список, поддерживаемый в scatterlist
?
Например, если имеется 4000 байтов данных, которые должны быть переданы с использованием DMA, как данные физически смежны, как список разброса делает их смежными? реализация scatterlist выделит 4000 байтов данных, используя Kmalloc
чтобы убедиться, что он получает физически непрерывную память? или это создаст связанный список?
Примечание: здесь мой запрос не о таблице SG, а об отдельном scatterlist
Допустим, мы хотим хранить данные 4000 байтов физически разрозненной памяти
struct scatterlist sg,
sg_init_one(&sg,data,4000)
Теперь, как этот sg решает проблему?
1 ответ
Кажется, вы смешиваете два разных списка разброса, т.е. struct scatterlist
в ядре Linux и списке разброса, которые могут поддерживаться конкретным контроллером DMA. В обоих случаях они не являются смежными. Это похоже на массив в первом случае и связанный список во втором. Когда вы звоните dmaengine_prep_slave_sg()
Фактический драйвер DMA преобразует его во внутреннюю структуру, которая может быть копией списка SG, нового списка SG, который вписывается в границы максимальной длины DMA, связанного списка DMA hw и так далее. В зависимости от драйвера DMA (давайте рассмотрим недавно добавленные драйверы / dma / hsu / hsu.c), первоначальный список SG копируется и передается в HW порциями не более чем 4 дескрипторами DMA hw, после завершения каждого блока он получает прерывание и продолжается, если начальное количество предметов больше 4, пока все не будет отправлено / получено.