2011-02-03 7 views
2

Я изучаю некоторые проблемы с повреждением памяти в драйвере 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, поэтому я думаю о внедрении буферов отказов.

+0

Хм, он должен быть виртуальным, поскольку он указывает на тот же буфер, верно? –

+0

@Nikolai: такой же буфер как что? –

+0

@Ben, так же, как '* head',' * tail' и '* end'. Взгляните на код e100, например, где он всегда «pci_map_single' на' skb-> data »при разговоре с оборудованием: http://lxr.linux.no/#linux+v2.6.37/drivers/net/ e100.C# L1883 –

ответ

4

Это виртуальный. В принципе что-либо типа foo * в ядре будет виртуальным адресом , и на самом деле вы очень редко будете обращаться с физическими адресами за пределами управления памятью низкого уровня - у вас либо будет виртуальный адреса, или struct page, что вам нужно до kmap, чтобы получить виртуальный адрес.

+0

Я предполагаю, что вы имели в виду «редко иметь дело с * физическими * адресами за пределами управления памятью низкого уровня». Но это явно неверно, драйверы для устройств с поддержкой DMA должны сообщать устройству физический адрес буфера DMA, и это тема моего вопроса. Я должен думать, что физические адреса должны храниться в виде целочисленного типа указателя, а не указателя, потому что они не могут быть разыменованы, но, глядя на существующий исходный код, это не так. Возможно, этот конкретный драйвер просто плохо написан. –

+0

Спасибо, исправлена ​​опечатка.И я полагаю, что мой опыт в основном связан с основным кодом ядра, а не с драйверами устройств, поэтому я не могу говорить о том, что делают случайные драйверы. Я ожидаю, что хорошо написанные сделают различие, но там много дрянных. – nelhage