Pergunta

O seguinte linha impressa de saída como 4 ao passo que I foi esperam 0.

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

Eu tentei isso em um sistema com um único processador. Não há bandeiras de depuração estão habilitados, enquanto a construção do kernel como CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC. De acordo com arquivos de cabeçalho do kernel, deve ser zero, mas a saída não é coerente com ela, algum palpite?

Foi útil?

Solução

O melhor acho que tenho é que, embora você tem uma única CPU, o kernel é ainda compilado com set CONFIG_SMP.

Outras dicas

O spinlock_t é sempre uma estrutura e que contém uma rawlock_t independentemente das opções de compilação do kernel. SMP e preempção do kernel pode adicionar campos extras ao spinlock_t, mas spinlock_t é sempre um tipo concreto com nenhum tamanho zero. O compilador precisa do spinlock_t a determinação de um verdadeiro tipo C válida caso contrário não seria compilar qualquer estrutura que incorporou um spinlock. Se não houver preempção ou SMP, em seguida, suas operações spinlock que não são NULL a estrutura. Para suportar uma estrutura de tamanho zero, seria muito sujo, cada referência teria de ser através de pré-processadores macros para que as extremidades spinlock_t por ser um int (x 86 em, pelo menos,), não há qualquer ponto indo para uma variável cujo tamanho é menos de 4 bytes, porque o compilador é provável que qualquer bloco variável para manter o alinhamento.

Pelo que me lembro, spinlock_t é habilitado apenas em CONFIG_SMP está definido ou seja ele é desativado em máquinas com um único processador. Portanto, você pode estar recebendo algum lixo.

Isso depende de sua arquitetura. Se você olhar para include/linux/spinlock_types_up.h, você pode ver que há de fato vezes em que ele vai sair para 0 tamanho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top