Frage

Die folgende Zeile gedruckte Ausgabe als 4 während I 0 erwarten

 printk(KERN_INFO "size of spinlock_t  %d\n", sizeof(spinlock_t));

Ich habe versucht, diese auf einem System mit einer CPU. Keine Debug-Flags aktiviert werden, während Kernel wie CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC bauen. Nach Kernel-Header-Dateien, sollte es Null sein, aber Ausgang ist damit nicht im Einklang, irgendwelche Vermutungen?

War es hilfreich?

Lösung

Die beste Vermutung ist, dass ich, obwohl Sie eine einzelne CPU haben, der Kernel noch mit CONFIG_SMP Set kompiliert wird.

Andere Tipps

Die spinlock_t ist immer eine Struktur und enthält eine rawlock_t unabhängig von Kernel-Build-Optionen. SMP und Kernel-Preemption können zusätzliche Felder zum spinlock_t hinzufügen, aber spinlock_t ist immer ein konkreter mit keiner Größe Null. Der Compiler muss die spinlock_t zu einem echten gültigen C-Typ zu lösen sonst wäre es keine Struktur erstellen, die eine spinlock eingebaut. Wenn es kein Vorkaufsrecht oder SMP dann Operationen sein die spinlock, die nicht die Struktur NULL sind. Um eine Null große Struktur zu unterstützen sehr chaotisch wäre, würde jede Bezugnahme über Pre-Prozessoren Makros sein muß so spinlock_t endet als ein int (auf x86 zumindest), gibt es keinen Punkt für eine Variable, deren Größe geht weniger als 4 Bytes ist, weil der Compiler wahrscheinlich irgendeine Variable zu Kontaktstellen-Ausrichtung zu halten.

Von dem, was ich mich erinnere, ist spinlock_t nur aktiviert, in CONFIG_SMP gesetzt heißt es auf Einprozessor-Maschinen deaktiviert. Daher werden Sie möglicherweise einige Müll zu bekommen.

Dies ist abhängig von Ihrer Architektur. Wenn man sich include/linux/spinlock_types_up.h anschaut, kann man sehen, dass es in der Tat Zeiten, in denen es auf 0 Größe herauskommen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top