Переполнение стека, я думаю, пока insmod - PullRequest
0 голосов
/ 18 мая 2011

Я собрал ядро ​​2.6.35 в моей системе с некоторыми конкретными требованиями. Я также собрал некоторый определенный приложением модуль с тем же ядром. Я загрузил встроенную версию и обнаружил, что она не работает должным образом, так как в некоторых графических интерфейсах и других модулях отсутствует проблема. Но система загрузилась, и я сделал insmod app.ko. Я столкнулся с аварией. Я обнаружил, что это проблема стека. Вызывающая функция в приложении передает адрес двух локальных переменных. как int a, b; добавить (& a, & b); Я проверил значения & a и & b перед передачей, и он остался ненулевым, но когда я получаю то же самое в вызывающей функции, оба & a, & b равны NULL или некоторому мусорному значению. Я увеличил размер стека, но ничего не произошло. Когда я пропустил вызов функции, я увидел, что много выделений памяти также не удалось. Поэтому я думаю, что это должно быть проблема с памятью. Есть ли что-то, что я должен проверить для опции gcc, чтобы определить стек или проверить переполнение стека. Любые намеки на это могут мне очень помочь. Заранее спасибо. Я только что сделал несколько абстрактных примеров, так как оригинальный раздел кода требует много времени для объяснения.

main()
    {

    struct DMAINFO* pDmaInfo;
    struct DESC* pDesc;
            /*  printk("The function aruguments are Desc = %p and DmaInfo %p", &pDesc, &pDmaInfo); */

    Create_DMA(&pDesc, &pDmaInfo);
    }


void Create_DMA(**ppDesc, **ppDmaInfor)
    {
    printk("The function aruguments are Desc = %p and DmaInfo %p", ppDesc, ppDmaInfo);
    }

Оператор printk внутри create_DMA дает мне значения NULL, но тот же оператор print в основной функции до вызова create_DMA имеет некоторые значения.

1 Ответ

0 голосов
/ 13 июля 2012

pDesc и pDmaInfo не инициализируются перед Create_DMA (), поэтому они содержат мусорное значение и вызывают оператор print в основной функции до того, как вызов create_DMA выведет некоторые значения.

When Create_DMA () вызывается, Create_DMA () пытается выделить память и некоторые другие ресурсы и поместить результат в pDesc и pDmaInfo.Когда Create_DMA () завершается неудачно, значение pDesc и pDmaInfo не определено, зависит от процесса Create_DMA ().

Чтобы избежать такой проблемы, вы всегда должны инициировать pDesc и pDmaInfoи тщательно напишите Create_DMA ().

main()
    {
    ....
    struct DMAINFO* pDmaInfo = NULL;
    struct DESC* pDesc = NULL;
    ....
}
...