定义一个内核panic问题

本文通过分析Linux内核4.1.44版本中网络子系统的问题,展示了出现问题时的反汇编代码及对应的源代码。具体探讨了__netif_receive_skb_core函数在处理接收数据包过程中的反汇编指令细节,并解释了deliver_skb函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现问题时的反汇编为:

/usr/src/debug/kernel-4.1.44-.aarch64/net/core/dev.c: 1780
0xffff800000860724 <__netif_receive_skb_core+420>: ldr x0, [x1,x0]
0xffff800000860728 <__netif_receive_skb_core+424>: str x0, [x29,#128]
0xffff80000086072c <__netif_receive_skb_core+428>: ldr x20, [x29,#128]
0xffff800000860730 <__netif_receive_skb_core+432>: cmp x25, x20
0xffff800000860734 <__netif_receive_skb_core+436>: sub x20, x20, #0x28
0xffff800000860738 <__netif_receive_skb_core+440>: b.eq 0xffff800000860760 <__netif_receive_skb_core+480>
/usr/src/debug/kernel-4.1.44-.aarch64/net/core/dev.c: 1781
0xffff80000086073c <__netif_receive_skb_core+444>: ldrh w0, [x20]

代码为:

static inline void deliver_ptype_list_skb(struct sk_buff *skb,
                      struct packet_type **pt,
                      struct net_device *orig_dev,
                      __be16 type,
                      struct list_head *ptype_list)
{
    struct packet_type *ptype, *pt_prev = *pt;

1780    list_for_each_entry_rcu(ptype, ptype_list, list) {
1781        if (ptype->type != type)
            continue;
        if (pt_prev)
            deliver_skb(skb, pt_prev, orig_dev);
        pt_prev = ptype;
    }
    *pt = pt_prev;
}
list_for_each_entry_rcu函数为:
#define list_for_each_entry_rcu(pos, head, member) \
    for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
        &pos->member != (head); \
        pos = list_entry_rcu(pos->member.next, typeof(*pos), member))

list_entry_rcu为:

#define list_entry_rcu(ptr, type, member) \
({ \
    typeof(*ptr) __rcu *__ptr = (typeof(*ptr) __rcu __force *)ptr; \
    container_of((typeof(ptr))rcu_dereference_raw(__ptr), type, member); \
})

container_of

#define container_of(ptr, type, member) ({            \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})

 

 

 

 

转载于:https://www.cnblogs.com/xingmuxin/p/9456775.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值