Uni-Processor에서 왜 Sizeof (spinlock_t)가 0보다 큰 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1626017

  •  06-07-2019
  •  | 
  •  

문제

다음 줄은 4로 출력을 인쇄 한 반면 0을 기대했습니다.

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

나는 단일 CPU가있는 시스템에서 이것을 시도했다. 커널과 같은 커널을 구축하는 동안 디버깅 플래그가 활성화되지 않습니다 CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC. 커널 헤더 파일에 따르면 0이어야하지만 출력은 그와 일치하지 않아야합니다.

도움이 되었습니까?

해결책

내가 가진 가장 좋은 추측은 단일 CPU가 있지만 커널이 여전히 컴파일된다는 것입니다. CONFIG_SMP 세트.

다른 팁

spinlock_t는 항상 구조이며 커널 빌드 옵션에 관계없이 Rawlock_t가 포함되어 있습니다. SMP 및 커널 선점은 spinlock_t에 추가 필드를 추가 할 수 있지만 Spinlock_t는 항상 제로 크기가없는 콘크리트 유형입니다. 컴파일러는 실제 유효한 C 유형으로 해결하려면 spinlock_t가 필요합니다. 그렇지 않으면 스핀 락을 통합 한 구조를 컴파일하지 않습니다. 선점 또는 SMP가 없으면 구조가 아닌 널 인 스핀 록 작업입니다. 제로 크기의 구조를지지하려면 매우 지저분 해지려면 모든 참조가 사전 프로세서를 통해 이루어져야하므로 spinlock_t는 int (적어도 x86에서)가되기 때문에 크기가 적은 변수에 대한 점이 없습니다. 컴파일러가 정렬을 유지하기 위해 변수를 패드 할 가능성이 있기 때문에 4 바이트보다.

내가 기억하는 바에 따르면 spinlock_t는 config_smp에서만 활성화되어 있습니다. 따라서 쓰레기를 얻을 수 있습니다.

이것은 당신의 아키텍처에 따라 다릅니다. 당신이 보면 include/linux/spinlock_types_up.h, 당신은 실제로 0 크기로 나올 시간이 있음을 알 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top