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

Linux 自定义以太网驱动程序问题,linux,driver,ethernet,Linux,Driver,Ethernet,我不知道这些问题是否与这里或超级用户相关,但还是要问 我在下面提到了一个Linux桌面PC系统的设置。与之相连的是一个定制的FPGA开发板。在这个FPGA中,有一个实现和执行的以太网网卡IP。该板使用USB端口、USB电缆和串行电缆连接到FPGA开发板。基本上,整个设置测试基于FPGA的网卡和在其上实现的相关以太网驱动程序 有许多应用程序运行在主机linux pc上,并将数据发送到基于FPGA的以太网n/w卡,该卡接受数据,进行必要的处理并发送到FPGA上实现的物理层,然后通过以太网将数据发送到

我不知道这些问题是否与这里或超级用户相关,但还是要问

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

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

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

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

  • 我如何继续隔离我的整个设置中涉及的不同组件(软件、硬件),以缩小问题的根本原因

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

  • 我应该遵循哪些步骤?如何判断VLC应用程序是否有问题,FPGA网卡驱动程序是否有问题,还是其他问题

  • 任何指针都是有用的

    谢谢


    -AD.

    您提到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;
    }
    
    #包括
    #包括
    #包括
    #包括
    int main()
    {
    结构调度参数调度参数;
    调度_parameters.sched_优先级=10;
    if(sched_setscheduler(getpid()、sched_FIFO和scheduling_参数)<0){
    printf(“错误为%d\n”,错误号);
    }
    execlp(“/bin/bash”,“bash”,0,0,0);
    返回0;
    }
    
    内核(软件)问题? 您可以启用并检查系统状态,然后从那里开始。内核开发人员使用此接口调试他们的软件。必须在内核编译时启用CONFIG_MAGIC_SYSRQ选项才能使用此功能

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


    启用内核调试器()也可能有帮助并通过串行电缆连接到它。

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

    一般原则是,如果您正在编写代码,它属于此处。如果您正在配置,它属于超级用户。在设置中,关于哪个我问,我已经编写了代码,即基于FPGA的以太网固件。