لماذا sizeof (spinlock_t) هو أكبر من الصفر على أحادي المعالج؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وخط الانتاج التالية المطبوعة إلى 4 في حين كنت أتوقع 0.

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

وحاولت هذه على نظام مع وحدة المعالجة المركزية واحدة. يتم تمكين أي أعلام التصحيح في حين أن بناء نواة مثل CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC. وفقا لملفات رأس النواة، فإنه ينبغي أن يكون الصفر ولكن الإخراج هو لا يتفق معها، أي التخمينات؟

هل كانت مفيدة؟

المحلول

وأفضل تخمين لدي هو أنه على الرغم من أن يكون لديك وحدة المعالجة المركزية واحدة، لا تزال جمعت النواة مع مجموعة CONFIG_SMP.

نصائح أخرى

ووspinlock_t هو دائما هيكل وأنه يحتوي على rawlock_t بغض النظر عن خيارات نواة بناء. SMP والاستباق نواة يمكن إضافة حقول إضافية إلى spinlock_t، ولكن spinlock_t هو دائما نوع ملموس مع أي حجم الصفر. المترجم يحتاج spinlock_t إلى حل إلى نوع C ساري المفعول الحقيقي إلا فإنه لن تجميع أي هيكل أن أدرجت spinlock. إذا لم يكن هناك الشفعة أو SMP ثم في عمليات spinlock التي هي NULL لا بنية. لدعم بنية الحجم الصفر سيكون فوضوي جدا، فإن كل إشارة تحتاج إلى أن تكون عبر ما قبل المعالجات وحدات الماكرو حتى spinlock_t ينتهي به الأمر عدد صحيح (على إلى x86 على الأقل)، وليس هناك أي معنى للذهاب لمتغير له حجم أقل من 4 بايت لأن المترجم هو المرجح لوحة أي متغير للحفاظ على التوافق.

ومن ما أتذكر، يتم تمكين spinlock_t فقط في CONFIG_SMP تم تعيين أي بمعنى تم تعطيله على الأجهزة أحادي المعالجة. لذلك، قد يكون الحصول على بعض القمامة.

وهذا يعتمد على الهندسة المعمارية الخاصة بك. اذا نظرتم الى include/linux/spinlock_types_up.h، يمكنك أن ترى أن هناك بالفعل مرات حيث سيخرج إلى 0 الحجم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top