Dưới đây là mẹo được sử dụng trong hạt nhân Linux cho các vật có giá trị trên mỗi cpu. Khi nhận xét cho biết, nó có thể đạt được hai mục tiêu sau:Làm thế nào để đảm bảo tính độc đáo của các biểu tượng toàn cầu và hạn chế phạm vi của nó trong C?
1. phạm vi bắt buộc.
2.đảm bảo tính duy nhất, thậm chí là tính năng tĩnh.
Sau đây là cách các vở kịch ma thuật (Để đơn giản, tôi subsititude của một số MACRO):
/*
* __pcpu_scope_* dummy variable is used to enforce scope. It
* receives the static modifier when it's used in front of
* DEFINE_PER_CPU() and will trigger build failure if
* DECLARE_PER_CPU() is used for the same variable.
*
* __pcpu_unique_* dummy variable is used to enforce symbol uniqueness
* such that hidden weak symbol collision, which will cause unrelated
* variables to share the same address, can be detected during build.
*/
#define DECLARE_PER_CPU_SECTION(type, name, sec) \
extern __attribute__((section(".discard"), unused)) \
char __pcpu_scope_##name; \
extern __attribute__((section(sec))) __typeof__(type) name
#define DEFINE_PER_CPU_SECTION(type, name, sec) \
__attribute__((section(".discard"), unused)) char __pcpu_scope_##name; \
extern __attribute__((section(".discard"), unused)) \
char __pcpu_unique_##name; \
__attribute__((section(".discard"), unused)) char __pcpu_unique_##name; \
__attribute__((section(sec))) __attribute__((weak)) \
__typeof__(type) name
Câu hỏi của tôi là
nhất cho mục tiêu # 1. Làm thế nào nó có thể thực thi phạm vi? Liệu nó làm việc như thế này:
Khi DECLARE * và DEFINE * tồn tại trong cùng đơn vị traslation, nó sẽ biến biến trong câu hỏi để liên kết nội bộ, và do đó, bất kỳ DECLARE * thêm cho cùng một biến sẽ kích hoạt xây dựng thất bại (nguyên nhân họ không đồng ý về mối liên hệ)
Nhưng nếu điều này là đúng, sau đó
- Làm thế nào các công trình interal-liên kết-receivement? Từ C99 6.9.2.2 (Định nghĩa đối tượng bên ngoài), điều này chỉ xảy ra cho định nghĩa dự kiến , nhưng trường hợp này có vẻ không phải là định nghĩa dự kiến ?
- Điều này không vi phạm quy tắc "One-definition-and-mutiple-declarationations-are-OK"?
nhất cho mục tiêu # 2, hai __pcpu_unique _ ## tên decalation (chính xác, một là tuyên bố, một trong những khác là định nghĩa) có vẻ chơi trcik giống như __pcpu_scope _ ## tên, thì làm sao nó giúp đỡ để đảm bảo tính độc đáo?
FYI, các mã trong câu hỏi có thể được xem tại đây: http://lxr.linux.no/linux+v3.9/include/linux/percpu-defs.h#L61
Đối với những người quan tâm, Google: [lkml + DECLARE_PER_CPU_SECTION + yếu] (https://www.google.ca/#q=lkml+DECLARE_PER_CPU_SECTION+weak) –
Cảm ơn rất nhiều :) – larmbr