2017-04-14 1 views
1

Utilisation de Visual Studio 2015 sur un projet pilote de noyau. J'ai remarqué que ce genre de chose se passe;VS2015 Les pointeurs ne cessent de changer, l'alignement?

dprintf("os %p; os_lock %p\n", os, &os->os_lock); 
mutex_init(&os->os_lock); 
mutex_enter(&os->os_lock); 

void mutex_init(kmutex_t *mp) { 
    dprintf("%s is %p\n", __func__, mp); 
    ... 

void mutex_enter(kmutex_t *mp) { 
    dprintf("%s is %p\n", __func__, mp); 
    ... 

os 0xffffa08b29041ac0; os_lock 0xffffa08b29041df8 
mutex_init is 0xffffa08b29041df8 
mutex_enter is 0xffffa08b29041df0 <--- 

Alors que s'est-il passé là? Bien sûr, c'est une chose d'alignement que VS2015 est en train de faire pour une raison quelconque, mais c'est très déroutant puisque le premier appel est correct, alors il décide de le rattraper dans le 2ème. Cela semble juste une très mauvaise chose. La structure est faite avec l'alignement dans l'esprit, et os_lock est + 0x338 po.

Je peux jeter #pragma pack(8) autour de cette structure pour l'arrêter, mais il semble arriver dans un certain nombre d'autres endroits, et il doit s'arrêter :) Je ne peux pas imaginer que VS2015 soit aussi aléatoire, donc ça doit être quelque chose que je réussis à faire.

Répondre

0

Hah, le monde est à nouveau sain d'esprit. Il s'avère que l'un des fichiers d'en-tête comportait #pragma pack(4) pour que la structure userland transmise au noyau soit la même, mais le fichier d'en-tête se terminait par #pragma push() - je ne savais pas exactement ce que le cerveau faisait, mais git commit était à 1h du matin. Ainsi, en fonction des fichiers inclus dans l'en-tête et de ceux qui ne l'ont pas été, le pack était 4 ou 8. Bien sûr, cela a rendu les choses intéressantes. Laissons cela aux gens du PEBCAK, désolé pour le bruit.