#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; потому что я использовал само значение, в то время как я хотел местоположение адреса.