你好
我正在使用驱动程序在接口(interface)上运行bi-di'iperf'测试。
要复制的步骤是在一个接口(interface)上运行bi-di I/O(另一个接口(interface)未激活):

  • 在DUT上运行iperf -c -P 8 -t 100000 -I 10
  • iperf -c,几乎立即从对等方获得与上述相同的参数(“iperf send”以上的1st 10s结束后)
    两个
  • 上均带有'iperf -s -w 256K'

    崩溃不是在驱动程序中发生的,而是在'iperf'上下文中发生的。我要复制粘贴堆栈跟踪:
     PID: 8855   TASK: f7036550  CPU: 0   COMMAND: "iperf"
     #0 [c074bed0] crash_kexec at c0443233
     #1 [c074bf14] die at c04064d3
     #2 [c074bf44] do_page_fault at c062134b
     #3 [c074bf94] error_code (via page_fault) at c0405abb
        EAX: f5888100  EBX: 00000000  ECX: 00100100  EDX: 00200200  EBP: 00000001
        DS:  007b      ESI: f5888000  ES:  007b      EDI: cb614000
        CS:  0060      EIP: c05c4e94  ERR: ffffffff  EFLAGS: 00010046
     #4 [c074bfc8] net_rx_action at c05c4e94
     #5 [c074bfe4] __do_softirq at c042aa65
    --- <soft IRQ> ---
     #0 [f281ac4c] do_softirq at c04073e5
     #1 [f281ac58] do_IRQ at c04074d9
     #2 [f281ac70] common_interrupt at c0405975
        EAX: 39383736  EBX: f281af4c  ECX: 00000428  EDX: 31303938  EBP: f378b042
        DS:  007b      ESI: f378b1c2  ES:  007b      EDI: 09fdb448
        CS:  0060      EIP: c04f1c07  ERR: ffffffba  EFLAGS: 00000202
     #3 [f281aca4] __copy_to_user_ll at c04f1c07
     #4 [f281acb0] memcpy_toiovec at c05bfecc
     #5 [f281acc4] skb_copy_datagram_iovec at c05c059b
     #6 [f281acf4] tcp_rcv_established at c05ef40a
     #7 [f281ad20] tcp_v4_do_rcv at c05f48c5
     #8 [f281ad54] tcp_prequeue_process at c05e6bdd
     #9 [f281ad5c] tcp_recvmsg at c05e90e2
    #10 [f281ad9c] sock_common_recvmsg at c05bb1c4
    #11 [f281adc0] sock_recvmsg at c05b8dc6
    #12 [f281aea0] sys_recvfrom at c05ba6ab
    #13 [f281af64] sys_recv at c05ba727
    #14 [f281af80] sys_socketcall at c05bab52
    #15 [f281afb8] system_call at c0404f44
        EAX: ffffffda  EBX: 0000000a  ECX: b6ba2340  EDX: 00014268
        DS:  007b      ESI: 00000000  ES:  007b      EDI: 09fbe630
        SS:  007b      ESP: b6ba2328  EBP: b6ba2378
        CS:  0073      EIP: 004ad410  ERR: 00000066  EFLAGS: 00000293
    crash>
    

    崩溃时的EIPnet_rx_action:0xdd/19ca。现在,我已经编译了kernel-2.6.18-238 sources(运行DUT的操作系统的源版本),并在'objdump -S ./net/core/dev.o > dev_o_dmp上做了一个./net/core/dev.c',它具有net_rx_acdtion()的定义。现在,在“dev_o_dmp”文件中,net_rx_action()具有许多内联定义,因此某种程度上不能完全反映源文件中的流程。在这种情况下,将0xdd添加到net_rx_action (say 32FF) => 340C的基本地址是安全的。即340C是引起崩溃'kernel paging request error'的有问题的行号。

    有关如何调试此问题的任何提示/建议将大有帮助

    最佳答案

    不幸的是,或者幸运的是,取决于您的观点,通过高度的优化,编译器可能会创建汇编代码,而调试格式无法将合理的C代码行映射到汇编指令。遇到此问题的情况类型取决于编译器,优化级别,调试符号格式,调试符号级别以及代码本身。

    您必须假设通过此技术获得的行号可能是错误的。话虽这么说,我在自己的内核工作中经常使用这种技术,但是我还没有遇到任何问题(敲竹杠)。只要记住,如果您遇到毫无意义的问题,则可能会出现行号错误的情况。

    10-01 07:47