Я исследую некоторые проблемы повреждения памяти в драйвере Ethernet для встроенной системы.
Я подозреваю, что существует проблема между контроллером DMA мастеринга шины и медленной SDRAM. Поэтому я хочу использовать отказов буфера в быстрой SRAM. Для этого мне нужно две вещи: я должен поместить физический адрес SRAM (с точки зрения мастера шины) в дескриптор буфера контроллера DMA и должен записать данные из буфера отказов в sk_buff в SDRAM, как только контроллер DMA сообщит входящий пакет.
Что я не смог определить, прочитав
указывает, является ли skb-> data физическим или виртуальным адресом. то есть я должен позвонить
memcpy(skb->data, phys_to_virt(bounce_addr), len);
или
memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len);
чтобы получить пакет в sk_buff, чтобы остальная часть сетевого стека linux могла его обработать?
РЕДАКТИРОВАТЬ: Это драйвер, о котором идет речь . Я бы сказал, что он передает виртуальные адреса в регистры контроллера DMA и поэтому не может работать, но у меня есть devkit, на котором работает этот код. Однако моя SDRAM не имеет таких хороших таймингов, как DDR SDRAM devkit, поэтому я думаю о реализации отказов буфера.