Проблема с нестандартным драйвером Ethernet - PullRequest
1 голос
/ 17 декабря 2009

Я не знаю, уместны ли эти вопросы здесь или у суперпользователя, но все равно спрашивайте.

У меня есть ниже упомянутая настройка - система Linux для настольных ПК. К этому подключена одна специализированная плата разработки FPGA. В этой FPGA реализована и выполняется IP-адрес сетевой карты Ethernet. Эта плата подключается к плате разработки FPGA с помощью USB-портов, USB-кабеля и последовательного кабеля. По сути, вся эта установка тестирует сетевую карту на основе FPGA и соответствующие драйверы Ethernet, реализованные на ней.

Существует множество приложений, которые работают на хост-компьютере Linux и отправляют данные на карту Ethernet n / w на базе FPGA, которая принимает их, выполняет необходимую обработку и отправляет их на физический уровень, реализованный на FPGA, который затем отправляет их. через сеть Ethernet на другой узел / устройство в сети.

Эта настройка работает нормально, даже если несколько приложений с хост-компьютера отправляют данные на сетевую карту FPGA. В качестве одного из приложений я использую проигрыватель VLC на базе Linux (мультимедийный проигрыватель) для воспроизведения некоторых потоков мультимедиа с хоста Linux, и эти данные отправляются на сетевую карту FPGA. В проигрывателе VLC я ищу (назад / вперед) поток, используя элементы управления проигрывателя vlc. Когда я выполняю эту операцию непрерывного поиска, она превращается в хост Linux. зависание / замораживания. Устройство ввода-вывода не работает, работает только перезагрузка.

Теперь я попытался просмотреть журналы в хосте linux pc / var / log (dmesg), чтобы выяснить, получил ли я информацию о том, какой процесс / приложение вызвало зависание, но я не смог получить никакой информации от него.

  1. Как мне перейти к изоляции различных компонентов (программного обеспечения, оборудования), участвующих во всей этой моей установке, чтобы сузить основную причину проблемы?

  2. Можно ли каким-либо образом связаться с замороженным linux-хостом (последовательный кабель или другое соединение, чтобы получить какие-либо данные от него, когда он зависает?

  3. Каким шагам я должен следовать? Как я могу узнать, является ли приложение VLC проблемой, или драйвер сетевой карты FPGA, или что-то еще?

Любые указатели будут полезны.

Спасибо.

-AD.

Ответы [ 2 ]

2 голосов
/ 17 декабря 2009

Вы упоминаете, что хост Linux заморожен. Сначала я бы определил, действительно ли оно заблокировано в ядре или существует какой-то процесс (ы) пользовательского пространства, потребляющий слишком много ЦП.

Может ли хост проверяться (желательно на интерфейсе, отдельном от вашей карты FPGA Ethernet)? Если он отвечает, ядро ​​не заблокировано.

Аппаратная проблема?

Если возможно, можно ли временно изменить настройку, чтобы удалить карту FPGA Ethernet и затем воспроизвести проблему? Я хотел бы сделать это, чтобы помочь изолировать проблемы, конкретно связанные с аппаратным обеспечением (FPGA Ethernet).

Проблема пространства пользователя (программного обеспечения)?

Если вы удалите VLC из уравнения, сможете ли вы по-прежнему блокировать / зависать, используя другой метод для генерации трафика Ethernet?

Вы можете попытаться создать оболочку с более высоким приоритетом для извлечения данных, когда система, кажется, зависает. Возможно, запустив top в этой высокоприоритетной оболочке, вы сможете определить, кто, если кто-либо, использует весь процессор. Вы можете запустить эту оболочку по сети (telnet / ssh) или через последовательный терминал.

#include <errno.h>
#include <sched.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    struct sched_param scheduling_parameters;

    scheduling_parameters.sched_priority = 10;

    if (sched_setscheduler(getpid(), SCHED_FIFO, &scheduling_parameters) < 0) {
        printf("error is %d\n", errno);
    }

    execlp("/bin/bash", "bash",0, 0, 0, 0);

    return 0;
}

Проблема с ядром (программным обеспечением)?

Вы можете включить магический ключ sysrq , проверить состояние системы и перейти оттуда. Разработчики ядра используют этот интерфейс для отладки своего программного обеспечения. Чтобы использовать эту функцию, во время компиляции ядра должна быть включена опция CONFIG_MAGIC_SYSRQ.

После эмпирического сужения ошибки до определенного модуля printk () все еще остается хорошим ресурсом.

Также может быть полезно включить отладчик ядра ( KDB ) и подключиться к нему через последовательный кабель.

1 голос
/ 20 декабря 2009

@ Jscheimer: спасибо за подробные указания по моей проблеме. После долгих отладок и некоторых обсуждений с другими разработчиками системы на рабочем месте, я наконец нашел причину. Существует периферийное устройство DMA, которое появляется во всей этой настройке. DMA был сконфигурирован для выравниваемого доступа, но где-то при передаче некоторых данных он получал невыровненный адрес в результате того, что я не проверял выравнивание буфера в коде, что вызывало зависание / зависание. И такого поведения не было.

...