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.
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
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} –
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