Почему sizeof (spinlock_t) больше нуля на однопроцессорном компьютере? - PullRequest
2 голосов
/ 26 октября 2009

Следующая строка напечатала как 4, тогда как я ожидал 0.

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

Я пробовал это в системе с одним процессором. При сборке ядра флаги отладки не включены, например CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC. Согласно заголовочным файлам ядра, он должен быть нулевым, но вывод не соответствует этому, какие-либо догадки

Ответы [ 5 ]

5 голосов
/ 27 октября 2009

Лучшее предположение, которое у меня есть, это то, что, хотя у вас один процессор, ядро ​​все равно скомпилировано с CONFIG_SMP set.

3 голосов
/ 26 октября 2009
2 голосов
/ 02 января 2010

spinlock_t всегда является структурой и содержит rawlock_t независимо от параметров сборки ядра. SMP и вытеснение ядра могут добавлять дополнительные поля в spinlock_t, но spinlock_t всегда является конкретным типом с нулевым размером. Компилятору нужен spinlock_t, чтобы преобразовать его в реальный действительный тип C, иначе он не скомпилирует какую-либо структуру, включающую спин-блокировку. Если нет вытеснения или SMP, то это операции спин-блокировки, которые имеют значение NULL, а не структуру. Чтобы поддерживать структуру нулевого размера, было бы очень грязно, каждая ссылка должна была бы быть через макросы препроцессора, так что spinlock_t заканчивает тем, что был int (по крайней мере на x86), нет никакой точки для переменной, размер которой меньше чем 4 байта, потому что компилятор, вероятно, дополнит любую переменную для поддержания выравнивания.

1 голос
/ 22 ноября 2009

Насколько я помню, spinlock_t включен только в CONFIG_SMP, установленном, т.е. он отключен на однопроцессорных машинах. Следовательно, вы можете получить мусор.

0 голосов
/ 22 января 2010

Это зависит от вашей архитектуры. Если вы посмотрите на include/linux/spinlock_types_up.h, вы увидите, что действительно есть времена, когда он выйдет в 0 раз.

...