2011-05-18 1 views
0

J'ai construit le noyau 2.6.35 sur mon système avec certaines exigences spécifiques. J'ai également construit un module défini par l'application avec le même noyau. J'ai démarré la version construite et je trouve que cela n'a pas fonctionné correctement car il y a des problèmes de gui et d'autres modules manquants. Mais le système a démarré et j'ai fait une application insmod. J'ai fait face à un accident. J'ai découvert que c'est un problème de pile. Une fonction d'appelant dans l'APP est l'adresse de passage de deux variables locales. comme int a, b; ajouter (& a, & b); J'ai vérifié les valeurs de & a et & b avant de passer et il est resté non nul, mais quand je reçois le même dans la fonction appelante, les & a, & b sont NULL ou une certaine valeur garbage. J'ai augmenté la taille de la pile mais rien ne s'est passé. Quand j'ai ignoré l'appel de fonction, j'ai pu voir que beaucoup d'allocation de mémoire a également échoué. Donc je pense que ça devrait être un problème de mémoire. Y at-il quelque chose que je devrais vérifier pour l'option gcc pour définir la pile ou vérifier le débordement de la pile. Tous les indices à ce sujet pourraient m'aider beaucoup. Merci d'avance. Je viens de faire quelques exemples abstraits puisque la section de code d'origine prend beaucoup de temps à expliquer.Dépassement de pile je devine tout en insmod

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); 
    } 

La déclaration printk à l'intérieur create_DMA me donne des valeurs NULL, mais la même instruction d'impression dans la fonction principale avant l'appel create_DMA a certaines valeurs.

+0

veuillez publier au moins l'exemple de code qui appelle 'ajouter (& a, & b)' et le code qui "reçoit la même chose dans la fonction d'appel". Juste à partir de la lecture que vous pourriez retourner les variables de la pile d'adresses. – Mat

+0

principal() \t { \t \t struct DMAINFO * pDmaInfo; \t struct DESC * pDesc; \t Create_DMA (& pDesc, & pDmaInfo); \t} Create_DMA void (** ppDesc, ** ppDmaInfor) \t {\t prink ("la fonction aruguments sont Desc =% p et DmaInfo% p", ppDesc, ppDmaInfor); \t} –

+2

n'envoyez pas de code dans les commentaires. Modifiez votre question et assurez-vous que vous utilisez le bouton '{}' dans l'éditeur pour qu'il apparaisse correctement dans l'aperçu. – Mat

Répondre

0

pDesc et pDmaInfo est désinitialisé avant Create_DMA(), il contient donc une valeur erronée et provoque l'instruction print dans la fonction principale avant que l'appel create_DMA ne renvoie certaines valeurs.

Lorsque Create_DMA() est appelée, Create_DMA() essayer de mémoire d'allocation et d'autres ressources et mettre le résultat à pDesc et pDmaInfo. Lorsque Create_DMA() échoue, la valeur de pDesc et pDmaInfo est indéfinie, dépend du processus de Create_DMA().

Pour éviter ce problème, vous devez toujours initer pDesc et pDmaInfo et écrire le Create_DMA() avec soin.

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