在Linux(系统模式)上,我们通常会设置动态分配内存的自旋锁,例如:
spinlock_t *my_lock = kzalloc(sizeof(spinlock_t), GFP_KERNEL);
spin_lock_init(my_lock);
我想(可能)也可以在没有任何动态分配的情况下设置它们,只需使用堆栈空间:
char spinspace[sizeof(spinlock_t)];
spinlock_t *my_lock = (void*)&spinspace;
spin_lock_init(my_lock);
它似乎有效,但我想知道在我的内核模块中是否允许并且安全地使用自旋锁。 该自旋锁最终可能会被导出或传递给其他内核代码。
无需使用
char
数组使声明过于复杂,你可以很好地做到:
spinlock_t my_lock;
spin_lock_init(&my_lock);
以上是完全有效的代码。它是有效的,并且在堆栈上声明自旋锁可能很有用,但是如果您想与同时运行的其他代码片段共享它,则必须小心。在函数内声明具有自动存储持续时间的变量仅使得在函数的生命周期内引用该变量有效。一旦函数返回(或者,根据情况,甚至可能早于返回),该变量将变得无效,因此将成为您传递的任何引用。因此,在这种情况下,您的函数需要比它定义的自旋锁的任何其他用户寿命更长。
事实上,您可以看到一些(非常罕见的)内核代码片段执行此操作,例如此处的
arch/mips/sgi-ip22/ip22-mc.c
。