当前位置: 技术问答>linux和unix
读内存,导致板子重启,为何??
来源: 互联网 发布时间:2016-08-30
本文导语: 函数如下,是一内核模块中用来解析网络报文的,但在执行红字部分的时候就会直接导致ARM板子重启,我一开始是以为memcpy出问题了,后来用eh->h_dest[0]这样最简单的一句访问内存的句子也是同样问题,于是打印了skb...
函数如下,是一内核模块中用来解析网络报文的,但在执行红字部分的时候就会直接导致ARM板子重启,我一开始是以为memcpy出问题了,后来用eh->h_dest[0]这样最简单的一句访问内存的句子也是同样问题,于是打印了skb的地址,是以下这些值:246,294,1828。感觉这个地址怎么这么小的,是不是这里有问题?还望高手指点迷津啊,谢谢了!
int parse_pkt(struct sk_buff *skb, u_int16_t skb_displ, struct pfring_pkthdr *hdr)
{
struct ethhdr *eh = (struct ethhdr *)(skb->data - skb_displ);
u_int16_t displ, ip_len;
memset(&hdr->parsed_pkt, 0, sizeof(struct pkt_parsing_info));
hdr->parsed_header_len = 9;
/* MAC adderess */
memcpy(&hdr->parsed_pkt.dmac, eh->h_dest, sizeof(eh->h_dest));
...
}
int parse_pkt(struct sk_buff *skb, u_int16_t skb_displ, struct pfring_pkthdr *hdr)
{
struct ethhdr *eh = (struct ethhdr *)(skb->data - skb_displ);
u_int16_t displ, ip_len;
memset(&hdr->parsed_pkt, 0, sizeof(struct pkt_parsing_info));
hdr->parsed_header_len = 9;
/* MAC adderess */
memcpy(&hdr->parsed_pkt.dmac, eh->h_dest, sizeof(eh->h_dest));
...
}
|
struct sk_buff是贯穿整个linux内核网络模块的结构,在网络模块的每一层都会修改他的内容,不过一般是设置一些指针及每一层自己独有的东西,skb->data是在驱动层到内核网络core层之间被赋值的,然后才去掉了mac头部,传给网络协议栈。
lz这个问题可能是因为没有移植完全底层的一些修改,register_device_handler跟驱动之间还有挺多关于skb的处理,可能是这部分遗漏了。
lz这个问题可能是因为没有移植完全底层的一些修改,register_device_handler跟驱动之间还有挺多关于skb的处理,可能是这部分遗漏了。
|
skb的地址,是以下这些值:246,294,1828是什么意思?对应那些变量的值?
LZ你的代码写得确实不怎么样,没有任何保护就指针来回地指。这类问题应该比较好调试的, 属于访问越界的问题。在对指针操作前,最好判断一下指针是否为空,在memcpy的时候,判断一下src, dest指针对应的内存空间大小是非常有必要的。
出错时,对应的变量值都为多少啊:
skb? skb_displ?
eh? eh变量内容?
正常情况下,这些值都应该是什么范围?
LZ你的代码写得确实不怎么样,没有任何保护就指针来回地指。这类问题应该比较好调试的, 属于访问越界的问题。在对指针操作前,最好判断一下指针是否为空,在memcpy的时候,判断一下src, dest指针对应的内存空间大小是非常有必要的。
出错时,对应的变量值都为多少啊:
skb? skb_displ?
eh? eh变量内容?
正常情况下,这些值都应该是什么范围?
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。