代码之家  ›  专栏  ›  技术社区  ›  goldenmean

自定义以太网驱动程序问题

  •  1
  • goldenmean  · 技术社区  · 15 年前

    我不知道这个问题是否与这里或超级用户相关,但无论如何都要问。

    我在下面提到了安装-一个Linux桌面PC系统。与之相连的是一个定制的FPGA开发板,其中有一个以太网网卡IP实现并执行。该板通过USB端口USB电缆和串行电缆连接到FPGA开发板。从本质上讲,整个设置测试了基于FPGA的网卡及其上实现的相关以太网驱动程序。

    有许多应用程序在主机Linux PC上运行,并将数据发送到基于FPGA的以太网N/W卡,后者接受数据,进行必要的处理并发送到FPGA上实现的物理层,然后通过以太网将数据发送到网络上的其他节点/设备。

    即使主机PC的多个应用程序向FPGA网卡发送数据,此设置也可以正常工作。作为应用程序之一,我使用基于Linux的VLC播放器(它是一个多媒体播放器)播放来自Linux主机的一些多媒体流,这些数据被发送到FPGA网卡。在VLC播放器中,我使用VLC播放器控件来查找(反向/正向)流。当我连续执行这个搜索操作时,它会使Linux主机挂起/冻结。没有I/O设备工作,只有重新启动才能工作。

    现在,我试图查看Linux主机pc/var/log(dmesg)中的日志,以了解是什么进程/应用程序导致了冻结,但我无法从中获得任何输入。

    1. 如何继续隔离整个设置中涉及的不同组件(软件、硬件),以缩小问题根源?

    2. 是否有任何方法可以通过某种方式(串行电缆或其他连接)与冻结的Linux主机通信,以便在挂起时从中获取任何数据?

    3. 我应该遵循哪些步骤?我如何判断VLC应用程序是否有问题,或者FPGA网卡驱动程序是否有问题,或者其他什么问题?

    任何指针都是有用的。

    谢谢。

    -广告。

    2 回复  |  直到 15 年前
        1
  •  2
  •   jschmier    15 年前

    您提到Linux主机已冻结。我首先要确定它是否被锁定在内核中,或者是否有一些用户空间进程占用了太多的CPU。

    主机是否可以被ping(最好是在与您的FPGA以太网卡分开的接口上)?如果它回复,内核就不会被锁定。

    硬件问题?

    如果可能,是否可以临时更改设置以删除FPGA以太网卡,然后重新生成问题?我这样做是为了帮助隔离与硬件(FPGA以太网)特定相关的问题。

    用户空间(软件)问题?

    如果您从等式中删除VLC,您仍然可以通过使用另一种方法生成以太网流量来实现锁定/挂起吗?

    您可以尝试创建一个以更高优先级运行的shell,以便在系统似乎挂起时检索数据。也许通过在这个高优先级shell中运行top,您可以确定谁(如果有)正在使用所有CPU。您可以通过网络(telnet/ssh)或通过串行终端运行此shell。

    #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;
    }
    

    内核(软件)问题?

    您可以启用 magic sysrq key 然后检查系统状态并从那里开始。内核开发人员使用这个接口调试他们的软件。要使用此功能,必须在内核编译时启用config“magic”sysrq选项。

    通过经验将bug缩小到特定模块后,printk()仍然是一个很好的资源。

    它还可以帮助启用内核调试程序( KDB )并通过串行电缆连接到它。

        2
  •  1
  •   goldenmean    15 年前

    @JScheimer:感谢您对我的问题提供详细的指导。在工作场所与其他系统开发人员进行了大量的调试和讨论之后,我终于找到了根本原因。在整个设置中,有一个DMA外围设备进入画面。DMA被配置为对齐访问,但是在某些数据传输中,由于我没有在代码中检查缓冲区对齐,它接收到一个未对齐的地址,这导致了挂起/冻结。这种行为没有任何模式。