2009-10-26 2 views
2

I이 단일 CPU를 갖는 시스템에 시도 4로 다음 행 인쇄물 I가 0유니 프로세서에서 sizeof (spinlock_t)가 0보다 큰 이유는 무엇입니까?

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

기대되었다 반면. CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC과 같은 커널을 빌드하는 동안 디버깅 플래그가 사용 가능하지 않습니다. 커널 헤더 파일에 따르면, 0이어야하지만 출력은 어떤 추측과도 일치하지 않습니까?

답변

5

내가 가진 가장 좋은 추측은 하나의 CPU를 가지고 있지만 커널이 여전히 CONFIG_SMP으로 컴파일되어 있다는 것입니다.

+0

올바른지, 커널은 CONFIG_SMP로 컴파일됩니다. –

3
+0

예, 구성원이없는 구조를 취할 수 있습니다. 0으로 인쇄됩니다. –

+2

그가 방금 지적한 기사는 C++ 표준에서 장과 절을 제공합니다. 빈 구조체에 대해 0을 제공하는 컴파일러를 사용하면 표준을 위반합니다. +1, 배피. –

+1

아하 ... 이것은 C++ 표준이며 리눅스 커널 코드이므로 C를 사용하고 있습니다. C에서 빈 구조체의 크기는 0입니다. –

1

내가 기억하는 바로는, spinlock_t는 CONFIG_SMP가 설정되어있을 때만 활성화됩니다. 즉, 유니 프로세서 컴퓨터에서는 disable입니다. 따라서 쓰레기가 나올 수 있습니다.

2

spinlock_t는 항상 구조이며 커널 빌드 옵션과 관계없이 rawlock_t를 포함합니다. SMP와 커널 선점은 spinlock_t에 추가 필드를 추가 할 수 있지만, spinlock_t는 항상 0 크기가없는 구체적인 유형입니다. 컴파일러는 실제 유효한 C 유형을 확인하기 위해 spinlock_t를 필요로합니다. 그렇지 않으면 스핀 록을 포함하는 구조를 컴파일하지 않습니다. 선매 또는 SMP가 없으면 구조가 아닌 NULL 인 스핀 록 작업이 수행됩니다. 크기가 작은 구조체를 지원하려면 매우 지저분 할 것입니다. 모든 참조는 전 처리기 매크로를 거쳐야 할 것이므로 spinlock_t는 int 형 (x86 이상)으로 끝나기 때문에 크기가 컴파일러는 정렬을 유지하기 위해 변수를 채우기 쉽기 때문에 4 바이트 미만입니다.

0

이것은 아키텍처에 따라 다릅니다. include/linux/spinlock_types_up.h을 보면 실제로 0 번 크기로 나올 때가 있다는 것을 알 수 있습니다.

관련 문제