В linux sk_buff - это skb-> data физический или виртуальный адрес? - PullRequest
2 голосов
/ 03 февраля 2011

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

1 Ответ

4 голосов
/ 04 февраля 2011

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

...