memcpy— сбой ядра после memcpy

#c #linux-kernel

#c #linux-ядро

Вопрос:

мне нужна помощь, я пытаюсь использовать 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;
  

Комментарии:

1. Как сформулировано, ваш вопрос не очень понятен или воспроизводим. На вашем месте я бы не просто выкидывал код, а четко и сжато объяснял, что происходит не так. Предоставьте код, который мы можем скомпилировать и протестировать, и объясните, что вы видели и чего ожидали. Также укажите, на какой ОС вы работаете, и в какой среде программирования вы тоже работаете.

2. Возвращается ли когда-нибудь вызов memcpy к? Если да, то какое значение оно возвращает? Поскольку это происходит в цикле, происходит ли сбой на первой итерации цикла или только тогда, когда remaining задано определенное значение?

3. хорошо, извините за мою неясность, я использую Linux 2.6.32-30-generic, что происходит, так это то, что я хорошо скомпилировал код без ошибок, но когда я загружаю его в ядро с помощью insmod deaggr.ko, экран становится черным, так что для его возврата я должен перезапустить. в var / log / сообщениях указано, что 31 м украденной памяти. производительность графики может пострадать. что я делаю, так это копирую заголовок mac из деагрегированного пакета (skbs, соединенных вместе), который является (* skb)-> mac_header, поверх одного skb, а затем вставляю его обратно в сетевой стек. сбой в цикле, но я прокомментировал, что цикл по-прежнему завершается сбоем в memcpy

4. я не знаю, могу ли я каким-либо образом прикрепить код, потому что stack overflow содержит ограниченное количество символов, поэтому я не могу загрузить код, потому что он длинный и в нем также есть файл .h

Ответ №1:

Действительно ли pos действителен? Какой memcpy вызывает у вас проблемы? Я полагаю, это ядро Linux?

Комментарии:

1. символ без знака *pos = (*skb)->data — MAC_LENGTH; // pos указывает на начало заголовка mac——————( это и есть pos)—— да, это проблема ядра. (это проблема с выдачей memcpy) memcpy(nskb-> data, sb-> mac_header, MAC_LENGTH);

2. Здравствуйте, кто-нибудь может, пожалуйста, помочь мне с приведенным выше кодом, я просто хочу знать, правильно ли я назначил свои указатели, потому что они есть, и я думаю, что это создает мне проблему

3. @docas не могли бы вы уточнить, на случай, если другие люди столкнутся с такой же проблемой? Это приемлемо, поэтому практикуйтесь писать ответ на свой собственный вопрос, а затем принимайте этот ответ. Помните, что мы все здесь для того, чтобы помогать друг другу и генерировать хорошие ссылки для решения проблем, с которыми мы все столкнемся в будущем. Спасибо

4. я имел в виду неправильные местоположения, которые я должен был использовать amp; потому что я использовал само значение, в то время как я хотел местоположение адреса.