2011-05-17 54 views
0

我需要帮助我想使用memcpy在内核空间复制一个头,但屏幕只是黑色,它似乎不喜欢我的memcpy。请有人帮助我。memcpy--内核崩溃后memcpy

 remaining = ntohs(iphead->tot_len) - 20; //(remaining = total size of ip packet - size of meta header) 
while(remaining != 0) { 
    currentHead = (struct iphdr *) pos; //save the first 'real' header 
    if(currentHead == NULL) 
     goto fail; 
    nskb = dev_alloc_skb(ntohs(currentHead->tot_len) + MAC_LENGTH); 
    if(nskb == NULL) 
     goto fail; //We can't allocate that memory so we leave 
    if(nskb->tail + MAC_LENGTH + ntohs(currentHead->tot_len) <= nskb->end){ 

     nskb->data = skb_put(nskb, (MAC_LENGTH + ntohs(currentHead->tot_len))); // allocated all the memory we need 
     memcpy(nskb->data,(*skb)->mac_header, MAC_LENGTH); //Put the mac header in place 
     nskb->mac_header = nskb->data; //Save the mac header location 
     nskb->network_header = nskb->data + MAC_LENGTH; //Move the pointer to where the network header will be 
     memcpy(nskb->network_header, pos, ntohs(currentHead->tot_len)); //save the ip + payload 

     nskb->data = nskb->network_header; 
+2

正如你所说的问题不是很清楚,或可重复。如果我是你,我不会抛出代码,但要清楚而简洁地解释出了什么问题。提供我们可以编译和测试的代码,并解释您看到的内容以及您的期望。同时指定您正在使用的操作系统以及您正在使用的编程环境。 – 2011-05-17 16:33:20

+0

对'memcpy'的调用是否会返回?如果是这样,它会返回什么值?由于这是一个循环,它在第一次循环迭代中失败还是只有在“剩余”是一个特定值时才会失败? – bta 2011-05-17 16:42:33

+0

确定对不起我的缺陷,正在运行Linux 2.6.32-30-通用正在发生的事情是,我编译好的代码没有错误,但是当我用insmod deaggr.ko将它上传到内核时,屏幕变黑得到它我必须重新启动。在var/log/messages中,它表示31米的被盗内存。图形性能可能受损。我正在做的是将一个mac头文件从(* skb) - > mac_header的解聚数据包(skbs捆绑在一起)复制到单个skb的顶部,然后将其插回网络堆栈。它在循环上失败,但我注释了循环仍然失败的memcpy – docas 2011-05-17 17:00:51

回答

0

pos是否真的有效?哪个memcpy会给你带来问题?这是我假设的Linux内核吗?

+0

unsigned char * pos =(* skb) - > data - MAC_LENGTH; // pos指向mac头部的开头------------------(这是pos的地方)-------是的,这是一个内核问题。 (这是memcpy给出的问题)memcpy(nskb-> data,sb-> mac_header,MAC_LENGTH); – docas 2011-05-17 16:36:34

+0

你好可以任何一个请帮我用上面的代码,我只是想知道,如果我已经分配我的指针,因为他们在那里,我认为给我的问题 – docas 2011-05-20 12:44:59

+0

上述代码的问题已被解决。 – docas 2011-06-07 14:33:54