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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top