Я изучаю некоторые проблемы с повреждением памяти в драйвере ethernet для встроенной системы.В linux sk_buff, является ли skb-> данными физический или виртуальный адрес?
Я подозреваю, что проблема между контроллером DMA для управления шиной и медленной SDRAM. Поэтому я хочу использовать буфер отказов в быстрой SRAM. Для этого мне нужно две вещи: я должен поместить физический адрес SRAM (с точки зрения мастера шины) в дескриптор буфера контроллера DMA, и я должен memcpy данные из буфера отказов в sk_buff в SDRAM, как только контроллер DMA сообщает о входящий пакет.
То, что я не смог определить, от чтения
является ли skb-> данные физического или виртуального адреса. то есть я должен позвонить
memcpy(skb->data, phys_to_virt(bounce_addr), len);
или
memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len);
получить пакет в sk_buff поэтому остальная часть сетевого стека Linux может обрабатывать?
EDIT: This is the driver in question. Я бы сказал, что он передает виртуальные адреса в регистры контроллера DMA и поэтому не может работать, но у меня есть devkit, на котором работает этот код. Однако моя SDRAM не имеет таких хороших таймингов, как devkit DDR SDRAM, поэтому я думаю о внедрении буферов отказов.
Хм, он должен быть виртуальным, поскольку он указывает на тот же буфер, верно? –
@Nikolai: такой же буфер как что? –
@Ben, так же, как '* head',' * tail' и '* end'. Взгляните на код e100, например, где он всегда «pci_map_single' на' skb-> data »при разговоре с оборудованием: http://lxr.linux.no/#linux+v2.6.37/drivers/net/ e100.C# L1883 –