Perché sizeof (spinlock_t) è maggiore di zero su uni-processor?
-
06-07-2019 - |
Domanda
La seguente riga ha stampato l'output come 4 mentre mi aspettavo 0.
printk(KERN_INFO "size of spinlock_t %d\n", sizeof(spinlock_t));
Ho provato questo su un sistema con CPU singola. Nessun flag di debug è abilitato durante la compilazione di kernel come CONFIG_DEBUG_SPINLOCK o CONFIG_DEBUG_LOCK_ALLOC
. Secondo i file header del kernel, dovrebbe essere zero ma l'output non è coerente con esso, qualche ipotesi?
Soluzione
La migliore ipotesi che ho è che sebbene tu abbia una singola CPU, il kernel è ancora compilato con CONFIG_SMP
impostato.
Altri suggerimenti
spinlock_t è sempre una struttura e contiene un rawlock_t indipendentemente dalle opzioni di compilazione del kernel. La prelazione di SMP e kernel può aggiungere campi extra a spinlock_t, ma spinlock_t è sempre un tipo concreto con una dimensione nulla pari a zero. Il compilatore ha bisogno che spinlock_t si risolva in un tipo C reale valido altrimenti non compilerebbe alcuna struttura che incorporasse uno spinlock. Se non vi è alcuna prelazione o SMP, le sue operazioni di spinlock che sono NULL non sono la struttura. Per supportare una struttura di dimensioni zero sarebbe molto disordinato, ogni riferimento dovrebbe essere tramite macro di pre-processori quindi spinlock_t finisce per essere un int (almeno su x86), non c'è alcun punto per una variabile le cui dimensioni sono inferiori di 4 byte perché è probabile che il compilatore riempia qualsiasi variabile per mantenere l'allineamento.
Da quello che ricordo, spinlock_t è abilitato solo in CONFIG_SMP è impostato, cioè è disabilitato su macchine uniprocessor. Pertanto, potresti ricevere della spazzatura.
Questo dipende dalla tua architettura. Se guardi include / linux / spinlock_types_up.h
, puoi vedere che ci sono davvero delle volte in cui uscirà a 0 dimensioni.